13

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.

enter image description here

+1

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. –

+0

@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! –

+0

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. –

Trả lời

2

Vấn đề bạn đang gặp phải là Capybara, theo mặc định, bắt đầu AUT ràng buộc để 127.0.0.1 và sau đó nói với người lái xe có yêu cầu trình duyệt so với cùng. Trong trường hợp của bạn tuy nhiên 127.0.0.1 không phải là nơi ứng dụng đang chạy (Từ phối cảnh trình duyệt), vì nó nằm trên một vùng chứa khác với trình duyệt. Để khắc phục điều đó, bạn cần đặt Capybara.server_host thành giao diện bên ngoài của vùng chứa "web" (có thể truy cập từ vùng chứa "chromeedriver"). Điều đó sẽ khiến Capybara liên kết AUT với giao diện đó và yêu cầu trình điều khiển để trình duyệt yêu cầu nó.

Trong trường hợp của bạn thì có lẽ người bạn có thể chỉ định 'web'

Capybara.server_host = 'web' 
Các vấn đề liên quan