【问题标题】:Increase WebDriver network timeout for a single test为单个测试增加 WebDriver 网络超时
【发布时间】:2015-05-05 13:29:33
【问题描述】:

有一个很重的页面,在 visiting 之后 Selenium 没有响应 Capybara 一分钟,所以无论我调用什么,都会抛出 Net::ReadTimeout
我可以以某种方式全局编辑它:

http_client = Selenium::WebDriver::Remote::Http::Default.new
http_client.timeout = 120
Capybara::Selenium::Driver.new(app,
  http_client: http_client,

但是在一些重复超时的情况下,我的测试会持续太久,所以我不想全局增加超时。
我想以某种方式为单个测试增加它:

before do
  @timeout = page.driver.bridge.http.timeout
  page.driver.bridge.http.timeout = 120
end
after do
  page.driver.bridge.http.timeout = @timeout
end

但在 /lib/selenium/webdriver/common/driver.rb 中,bridge 方法是私有的,而只有 browsercapabilities 公开。

那么全局编辑这个超时属性的正确方法是什么?

UPD:即使我找到了如何设置此属性,似乎before/after 方法也不起作用,因为@http ||= ( 将默认超时值保存在第一个before 在我之前的 setUp 链中。

【问题讨论】:

  • 也许和 ajax 请求一样? def wait_for_ajax Capybara.current_session.instance_eval do wait_until { evaluate_script('$.active').zero? } end end
  • @rubykid,这个超时是一个较低级别的异常——当 Selenium 挂起时,你甚至不能 evaluate script
  • 'driver.send(:bridge)' ?
  • @rubykid,这就是我现在用来破解隐私的方法。需要几分钟来确保实现目标。但我想找到正确的方法,而不需要破解。

标签: ruby rspec selenium-webdriver timeout capybara


【解决方案1】:

Capybara 有一个可以在测试过程中更改的 default_wait_time:

using_wait_time 120 do
  foo(bar)
end

【讨论】:

  • 我认为这设置了选举人的超时时间,而不是低级别的通信。
  • @Nakilon 是正确的。 Capybara 的 default_wait_time 是等待的时间,例如出现在页面上的 CSS 或内容。而这里说的是Capybara浏览器的http_client请求read_timeout。
【解决方案2】:

这就是我打破私有方法、没有 getter 的属性以及为单个命令修补超时的方式:

http = page.driver.browser.send(:bridge).http.instance_variable_get(:@http)
old_timeout = http.read_timeout
begin
  http.read_timeout = 120
  find("anything") # here we had timeout
ensure
  http.read_timeout = old_http_timeout
end

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多