我正在尝试从PhantomJS迁移到无头Chrome,并且遇到了一些麻烦。对于本地测试,我正在使用Docker Compose来启动并运行所有相关服务。要配置Google Chrome,我使用的是将其与ChromeDriver捆绑在一起的映像,同时在端口4444上提供该映像。然后,在此简化的docker-compose.yml文件中,将其链接到我的应用程序容器,如下所示:

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: ""


然后,我有一个spec/spec_helper.rb文件,该文件引导测试环境和相关工具。我定义了:headless_chrome驱动程序,并将其指向ChromeDriver的本地绑定。 http://chromedriver:4444。我很确定以下是正确的:

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


我们也使用VCR,但我已将其配置为忽略与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


我使用Docker Compose启动服务,后者会触发测试运行程序。该命令几乎是这样的:

$ bundle exec rspec --format progress --profile --tag 'broken' --tag 'js' --tag '~quarantined'


稍等片刻之后,我遇到了第一个失败的测试:

  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)>'


所有规格都有相同的错误。因此,我将其放入容器中以自己手动运行测试并捕获要针对其进行测试的HTML。我将其保存在本地并在浏览​​器中打开,以受到以下Chrome错误页面的欢迎。 ChromeDriver似乎无法评估规范的HTML,因为它无法达到规范,因此它尝试针对此错误页面运行测试。

鉴于以上信息,我在这里做错了什么?我感谢任何帮助,因为摆脱PhantomJS可以为我们解决很多麻烦。

提前非常感谢您。请让我知道是否需要其他信息。

ruby-on-rails - 使用ChromeDriver,Capybara和Docker Compose的“拒绝连接”-LMLPHP

最佳答案

您遇到的问题是,默认情况下,Capybara启动绑定到127.0.0.1的AUT,然后告诉驱动程序要求来自同一目录的浏览器请求。但是,就您而言,应用程序不在127.0.0.1的运行位置(从浏览器的角度来看),因为它位于与浏览器不同的容器中。要解决此问题,您需要将Capybara.server_host设置为“ web”容器的外部接口(可以从“ chromedriver”容器访问)。这将导致Capybara将AUT绑定到该接口,并告诉驱动程序让浏览器对其发出请求。

就您而言,这可能意味着您可以指定“网络”

Capybara.server_host = 'web'

关于ruby-on-rails - 使用ChromeDriver,Capybara和Docker Compose的“拒绝连接”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46072732/

10-16 06:28