Capybara Using Selenium, With RSpec, in the Vagrant (Remotely)
Selenium
3
Capybara
4
Rspec
5
Vagrant
15
White

Dinh Hoang Hiep viết ngày 23/05/2015

Chào mọi người, với những bạn sử dụng Vagrant (hoặc các Linux Server) để làm môi trường phát triển thì khi run rspec request test (option :js => true) thì sẽ gặp rất nhiều khó khăn vì trên varant không thể khởi chạy được Firefox UI mặc dù đã cài rồi và khi chạy bạn sẽ nhận được thông báo lỗi như sau:

Failure/Error: visit "/whatever"
     Selenium::WebDriver::Error::WebDriverError:
       Could not find Firefox binary (os=linux). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path=

Hiện tại thì cũng có Poltergeist (Poltergeist is another headless driver which integrates Capybara with PhantomJS. It is truly headless, so doesn't require Xvfb to run on your CI server. It will also detect and report any Javascript errors that happen within the page. https://github.com/jnicklas/capybara#poltergeisthttps://github.com/jnicklas/capybara#poltergeist) tức là mình không cần cài firefox driver lên vagrant mà vẫn có thể run được các tests này nhưng bản thân mình thì không thích sử dụng Poltergeist vì khi run rest thì mình khổng thể theo dõi Poltergeist đã và đang làm gì bên UI của mình (nghĩa là đang click vào đâu, đang fill thông tin gì v.v.v.v). Trong thời gian tìm hiểu mình cũng có tìm hiểu thì cũng có một số cách nhưng mình thấy hay nhất và trực quan nhất (đối với mình) là chạy Capybara Remotely.

Yêu cầu

  • Có một máy chạy Linux OS bản Desktop đã cài phần mềm Firefox (trong bài này mình sử dụng máy ảo chạy OS Ubuntu Desktop 14.04 LST) mình tạm gọi đây là máy Desktop nhé
  • Selenium Server Download

Các bước thực hiện:
Bước 1: Bạn tạo file [Rails App]/spec/support/capybara_remote.rb với nội dung sau:

# SELENIUM_SERVER is the IP address or hostname of the system running Selenium
# Server, this is used to determine where to connect to when using one of the
# selenium_remote_* drivers
SELENIUM_SERVER = "192.168.0.2" # Đây là IP của máy Desktop

# SELENIUM_APP_HOST is the IP address or hostname of this system (where the
# tests run against) as reachable for the SELENIUM_SERVER. This is used to set
# the Capybara.app_host when using one of the selenium_remote_* drivers
SELENIUM_APP_HOST = "192.168.0.111" # Còn đây là IP của máy Vagrant

# CAPYBARA_DRIVER is the Capybara driver to use, this defaults to Selenium with
# Firefox
CAPYBARA_DRIVER = "selenium_remote_firefox"

# At this point, Capybara.default_driver is :rack_test, and
# Capybara.javascript_driver is :selenium. We can't run :selenium in the Vagrant box,
# so we set the javascript driver to :selenium_remote_firefox which we're going to
# configure.
Capybara.javascript_driver = :selenium_remote_firefox

RSpec.configure do |config|

  config.before(:each) do
    Capybara.server_host = '0.0.0.0' # Config này là để những máy ở ngoài có thể truy cập vào Capybara server khi mà bạn run test
    if selenium_remote?
      Capybara.app_host = "http://#{SELENIUM_APP_HOST}:#{Capybara.current_session.server.port}"
    end
  end

  config.after(:each) do
    Capybara.reset_sessions!
    Capybara.use_default_driver
    Capybara.app_host = nil
  end

  # Determines if a selenium_remote_* driver is being used
  def selenium_remote?
    !(Capybara.current_driver.to_s =~ /\Aselenium_remote/).nil?
  end
end

# CapybaraDriverRegistrar is a helper class that enables you to easily register
# Capybara drivers
class CapybaraDriverRegistrar

  # register a Selenium driver for the given browser to run on the localhost
  def self.register_selenium_local_driver(browser)
    Capybara.register_driver "selenium_#{browser}".to_sym do |app|
      Capybara::Selenium::Driver.new(app, browser: browser)
    end
  end

  # register a Selenium driver for the given browser to run with a Selenium
  # Server on another host
  def self.register_selenium_remote_driver(browser)
    Capybara.register_driver "selenium_remote_#{browser}".to_sym do |app|
      Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{SELENIUM_SERVER}:4444/wd/hub", desired_capabilities: browser)
    end
  end
end

# Register various Selenium drivers
CapybaraDriverRegistrar.register_selenium_remote_driver(:firefox)

Bước 2: Thêm config require_relative capybara_remote vào [Rails App]/spec/spec_helper.rb (ngay dưới dòng require 'capybara/rspec')

require_relative 'support/capybara_remote'

Bước 3: Tải và chạy Selenium Server ở máy Desktop

sudo java -jar selenium-server-standalone-2.45.0.jar 

Sau khi chạy bạn sẽ được như hình alt text

Bước 4: Bây giờ bạn có thể run test UI được rồi đó. Khi run test tại máy vagrant thì Capybara sẽ dựng một server test rồi chạy những task có UI thông qua Selenium Firefox driver được cài ở máy Desktop và thực hiện các thao tác trên Firefox UI này, mình có thể theo dõi trực tiếp các bước mà mình đã viết trong file test ngay trên màn hình của máy desktop.

Nguồn mình tham khảo tại softr.li và có sửa lại một số chỗ tại file capybara_remote.rb do phiên bản capybara hiện tại có một số thay đổi nên phải sửa lại nó mới chạy. Đây là những kiến thức mà mình biết được mong là sẽ có thể giúp ích cho những bạn đang gặp vấn đề như mình. Do kiến thức hạn hẹp nên chỉ có thể biết được như vậy thôi, mong nhận được các góp ý từ các bạn. Thanks :)

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Dinh Hoang Hiep

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
16 0
Crawl dữ liệu Crawl là một vấn đề hay gặp trong quá trình làm software. Ví dụ lấy tin tức, tin giảm giá, vé xem phim... là những dạng của crawl. Mộ...
Thach Le viết hơn 2 năm trước
16 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!