Tôi đang cố gắng chuyển từ PhantomJS sang Chrome không đầu và đã gặp phải một chút xíu. Đối với thử nghiệm cục bộ, tôi đang sử dụng Docker Compose để có được tất cả các dịch vụ phụ thuộc và chạy. Để cung cấp Google Chrome, tôi đang sử dụng một hình ảnh bao gồm cả tệp và ChromeDriver cùng nhau khi phân phát trên cổng 4444
. sau đó tôi liên kết nó với các thùng chứa ứng dụng của tôi như sau trong docker-compose.yml
tập tin đơn giản này:"Từ chối kết nối" bằng ChromeDriver, Capybara & Docker Compose
web:
image: web/chrome-headless
command: [js-specs]
stdin_open: true
tty: true
environment:
- RACK_ENV=test
- RAILS_ENV=test
links:
- "chromedriver:chromedriver"
chromedriver:
image: robcherry/docker-chromedriver:latest
ports:
- "4444"
cap_add:
- SYS_ADMIN
environment:
CHROMEDRIVER_WHITELISTED_IPS: ""
Sau đó, tôi có một tập tin spec/spec_helper.rb
mà bootstraps môi trường thử nghiệm và dụng cụ liên quan. Tôi xác định trình điều khiển :headless_chrome
và trỏ nó vào liên kết cục bộ của ChromeDriver; http://chromedriver:4444
. Tôi chắc rằng những điều sau đây là đúng:
Capybara.javascript_driver = :headless_chrome
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w[headless disable-gpu window-size=1440,900] },
)
Capybara::Selenium::Driver.new app,
browser: :chrome,
url: "http://chromedriver:4444/",
desired_capabilities: capabilities
end
Chúng tôi cũng sử dụng VCR, nhưng tôi đã cấu hình nó để bỏ qua bất kỳ kết nối vào cổng được sử dụng bởi ChromeDriver:
VCR.configure do |c|
c.cassette_library_dir = 'spec/vcr_cassettes'
c.default_cassette_options = { record: :new_episodes }
c.ignore_localhost = true
c.allow_http_connections_when_no_cassette = false
c.configure_rspec_metadata!
c.ignore_hosts 'codeclimate.com'
c.hook_into :webmock, :excon
c.ignore_request do |request|
URI(request.uri).port == 4444
end
end
tôi bắt đầu dịch vụ với Docker Compose, kích hoạt trình kiểm tra. Lệnh là khá nhiều này:
$ bundle exec rspec --format progress --profile --tag 'broken' --tag 'js' --tag '~quarantined'
Sau một chút chờ đợi, tôi gặp phải những thử nghiệm thất bại đầu tiên:
1) Beta parents code redemption: redeeming a code on the dashboard when the parent has reached the code redemption limit does not display an error message for cart codes
Failure/Error: fill_in "code", with: "BOOK-CODE"
Capybara::ElementNotFound:
Unable to find field "code"
# ./spec/features/beta_parents_code_redemption_spec.rb:104:in `block (4 levels) in <top (required)>'
Tất cả các thông số kỹ thuật có lỗi tương tự. Vì vậy, tôi đưa vào thùng chứa để tự chạy các bài kiểm tra theo cách thủ công và nắm bắt HTML mà nó đang thử nghiệm. Tôi lưu nó cục bộ và mở nó trong trình duyệt của mình để được trang lỗi Chrome sau đây hoan nghênh. Có vẻ như ChromeDriver không đánh giá HTML của thông số kỹ thuật vì nó không thể tiếp cận nó, do đó, nó cố gắng chạy các thử nghiệm đối với trang lỗi này.
Với thông tin trên, tôi đang làm gì sai ở đây? Tôi đánh giá cao bất kỳ và tất cả sự giúp đỡ khi di chuyển ra khỏi PhantomJS sẽ giải quyết vì vậy nhiều sự đau đầu đối với chúng tôi.
Cảm ơn bạn rất nhiều trước. Vui lòng cho tôi biết nếu bạn cần thêm thông tin.
bạn đang chạy RSpec/Capybara trên dụ Docker hoặc máy tính cục bộ của bạn? Nếu sau này bạn cần đặt 'Capybara.app_host' để trỏ đến địa chỉ bất kỳ mà máy cục bộ của bạn là từ cá thể trình docker. –
@ThomasWalpole Đó là cựu trong trường hợp này, tôi sợ. Tất cả mọi thứ đang chạy trong container. Cảm ơn vì đã phản hồi! –
Ah, xin lỗi - Tôi đã bỏ lỡ vùng chứa "web" - câu trả lời sắp tới bên dưới. –