【问题标题】:Webdriver latency issueWebdriver 延迟问题
【发布时间】:2011-08-15 22:56:49
【问题描述】:

是否有其他人在使用 Webdriver 时遇到延迟问题?我让它和 Capybara 在 Cucumber 上运行。而且填写一张表格需要30多秒甚至几分钟的时间。由于某种原因,当两个字段都被 id 引用时,它会填写一个字段,然后在填写另一个字段之前暂停。

此外,由于这种延迟,我遇到了超时错误。 (但他们是不稳定的......)

这些字段没有什么特别之处。它们出现在页面加载时,并且此页面上没有 Ajax。

有人有什么想法吗?

这是错误:

execution expired (Timeout::Error)
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/timeout.rb:60:in `rbuf_fill'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/protocol.rb:126:in `readline'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:2026:in `read_status_line'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:2015:in `read_new'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:1051:in `request_without_webmock'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:1037:in `request_without_webmock'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:543:in `start'
     /Users/me/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb:1035:in `request_without_webmock'

编辑:这可能与我在运行 Cucumber 测试时已经打开了一个 Firefox 实例有关。尽管超时的频率降低了,但我仍然经常遇到它们,我认为这仍然是一个问题。

Edit2: 功能文件将指定一个步骤: And I complete personal info

该步骤将进一步定义为其他步骤:

And /^I complete personal info$/ do
  fill_in('first_id', :with => "foo")
  fill_in('second_id', :with => "bar")
  ...more fill_ins...
end

Capybara 有时会找到first_id,而我的场景的其余部分执行得很好。其他时候,它会超时。在我看来,这是非常不可预测的。还有一些时候,它会找到first_id,但找不到second_id。顺便说一句,这些ids 确实存在于页面上。

我应该包含有关该错误的更多信息。它通常看起来像这样:

...all that stuff I included in the error above...
./features/step_definitions/web_steps.rb:107
./features/step_definitions/web_steps.rb:11:in `with_scope'
./features/step_definitions/web_steps.rb:105:in `/^(?:|I )should see "([^"]*)"(?: within "([^"]*)")?$/'
/my feature file:30:in 'Then we verify stuff we just filled out'

Then we verify stuff we just filled out 是通过这些附加步骤定义的:

And %{I should see "foo"}
And %{I should see "bar"}

我希望这些额外的信息对您有所帮助!如果您还需要什么,请在 cmets 中告诉我。

【问题讨论】:

  • 你是说webdriver还是selenium-webdriver?还有,什么版本的webdriver、cucumber、capybara、rails(看起来像ruby 企业版1.8.7)?
  • 我很确定这不是您正在运行的其他 Firefox 实例。使用你的 Cucumber、Capybara 和 WebDriver 堆栈时,我会时不时地出现超时——但它们与其他正在运行的 FF 实例无关。

标签: ruby-on-rails capybara webdriver


【解决方案1】:

我对 webmock 不熟悉,但从回溯来看,这不是罪魁祸首——因为 WebDriver 使用 HTTP 与 Firefox 通信,特别是默认情况下是 Net::HTTP。

要确认这一点,您可以tell WebDriver to use Curb instead,希望不会受到 webmock 所做的影响。

【讨论】:

  • 我对为什么需要确认这一点感到困惑。另外,我不清楚默认使用 Net::HTTP 意味着什么。最后,我没有安装 Curb 或 net-http-persistent gem。我的意思是,我当然可以安装它,但是,我再次不确定为什么需要。
  • 抱歉不清楚。 WebDriver 默认使用 Net::HTTP 向用于控制浏览器的 Firefox 扩展发送命令。 Webmock AFAIK 将修补 Net::HTTP,这是问题的最可能原因。如果使用 Webmock 不涉及的 HTTP 堆栈可以解决问题,我们已经确认 Webmock 是问题的原因,并且离弄清楚发生了什么更近了一步。
  • 仔细观察后,看起来 WebMock 也会模拟 Curb 请求。如果您能提供一个简单的脚本来重现该问题,将会很有帮助。
【解决方案2】:

您遇到的问题是由 WebMock 引起的,它破坏了默认的 Net::HTTP 行为。此问题现已在 WebMock 1.7.0 中得到修复

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2018-07-19
    相关资源
    最近更新 更多