代码之家  ›  专栏  ›  技术社区  ›  Wilhelm Murdoch

使用ChromeDriver、Capybara和Docker Compose“拒绝连接”

  •  15
  • Wilhelm Murdoch  · 技术社区  · 7 年前

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

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

    鉴于以上信息,我在这里做错了什么?我感谢任何人的帮助,因为离开PhantomJS将解决这个问题 所以 我们有很多头痛的事。

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  3
  •   Thomas Walpole    7 年前

    127.0.0.1 然后告诉驱动程序从相同的浏览器请求。然而,在你的例子中,127.0.0.1并不是应用程序运行的地方(从浏览器的角度来看),因为它与浏览器位于不同的容器中。要解决这个问题,您需要设置 Capybara.server_host 无论“web”容器的外部接口是什么(可以从“chromedriver”容器访问)。这将导致水豚将AUT绑定到该界面,并告诉驱动程序让浏览器向其发出请求。

    在您的情况下,这可能意味着您可以指定“web”

    Capybara.server_host = 'web'