Wil*_*och 14 ruby-on-rails capybara docker-compose google-chrome-headless
我正试图从PhantomJS转向Headless Chrome,并遇到了一些障碍.对于本地测试,我使用Docker Compose来启动和运行所有相关服务.要配置谷歌浏览器,我使用的图像将它和ChromeDriver捆绑在一起,同时在端口上提供服务4444.然后我在这个简化的docker-compose.yml文件中将它链接到我的app容器,如下所示:
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: ""
Run Code Online (Sandbox Code Playgroud)
然后,我有一个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
Run Code Online (Sandbox Code Playgroud)
我们也使用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
Run Code Online (Sandbox Code Playgroud)
我使用Docker Compose启动服务,触发测试运行器.命令就是这样:
$ bundle exec rspec --format progress --profile --tag 'broken' --tag 'js' --tag '~quarantined'
Run Code Online (Sandbox Code Playgroud)
经过一段时间的等待,我遇到了第一次失败的测试:
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)>'
Run Code Online (Sandbox Code Playgroud)
所有规格都有相同的错误.因此,我将shell封装到容器中以手动运行测试并捕获它正在测试的HTML.我在本地保存并在我的浏览器中打开它以受到以下Chrome错误页面的欢迎.看起来ChromeDriver没有评估规范的HTML,因为它无法访问它,因此它会尝试针对此错误页面运行测试.
鉴于以上信息,我在这里做错了什么?我感谢任何和所有的帮助,因为离开PhantomJS会为我们解决这么多的麻烦.
非常感谢你提前.如果您需要额外的信息,请告诉我.
您遇到的问题是,Capybara 默认情况下会启动绑定到的 AUT 127.0.0.1,然后告诉驱动程序接收来自同一设备的浏览器请求。然而,在您的情况下,127.0.0.1 不是应用程序运行的位置(从浏览器的角度来看),因为它位于与浏览器不同的容器上。要解决这个问题,您需要设置Capybara.server_host“web”容器的外部接口(可以从“chromedriver”容器访问)。这将导致 Capybara 将 AUT 绑定到该接口并告诉驱动程序让浏览器向它发出请求。
在你的情况下,这可能意味着你可以指定“web”
Capybara.server_host = 'web'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |