1

下面是我的脚本。正如下面的代码注释中提到的,当我执行browser.text.include?(item).should == truefrom时,cmd prompt -> irb我正确地得到了true在搜索预期网页内容时返回的值。但是,在此脚本中执行时,它不起作用并返回false. 有趣的是,如果我将脚本更改为browser.html.include?(item).should == true它在脚本中和通过 cmd 提示符都可以工作。问题是什么?

我正在使用 ruby​​ 1.9.3 和下面列出的 gem。任何帮助都是极好的!!谢谢!!

require 'watir-webdriver'
require 'rspec'
require 'rubygems'

Given(/^that I have gone to the Google page$/) do
  @browser = Watir::Browser.new :ff
  @browser.goto "http://www.google.com"
end

When(/^I add "(.*)" to the search box$/) do |item|
  @browser.text_field(:name => "q").set(item)
end

And(/^click the Search Button$/) do
  @browser.button(:name => "btnG").click
end

Then(/^"(.*)" should be mentioned in the results$/) do |item|
  @browser.text.include?(item).should == true
  #the line directly above works in cmd prompt -> irb -> and returns a value of true
  #but when executed from this script returns a value of false and shows up as failed in the
  #cucumber html report
  @browser.close
end
4

1 回答 1

0

在处理使用大量 ajax 的页面时,您遇到了挑战之一。ajax 的问题是让 watir 很难知道页面何时完成加载。

您的脚本中发生了什么:

  1. 输入搜索字段并单击按钮
  2. 开始加载搜索结果
  3. Watir 认为页面已完成加载
  4. 断言运行,由于页面尚未完成加载结果而失败
  5. 该页面实际上已完成加载。

当您通过 irb 手动执行此操作时,您可能会在单击按钮和检查页面实际完成加载的结果之间等待足够长的时间。

如果将断言更改为 a puts @browser.text,您将看到页面文本仅包含页面的标题(不同的链接)。如果您执行类似 a 的操作sleep(5); puts @browser.text,您将看到您期望的文本出现。

此类问题的解决方案是等待动态加载的元素。虽然您可以使用sleep,但这是一个糟糕的选择,因为您等待的时间可能比您必须的要长。相反,请使用http://watirwebdriver.com/waiting/中描述的隐式等待。

以下脚本为我解决了计时问题。基本上它正在等待ol包含搜索结果的元素出现。

require 'watir-webdriver'
require 'rspec'

item = 'watir'

@browser = Watir::Browser.new :ff
@browser.goto "http://www.google.com"
@browser.text_field(:name => "q").set(item)
@browser.button(:name => "btnG").click
@browser.ol(:id => 'rso').wait_until_present
@browser.text.include?(item).should == true
@browser.close

顺便说一句,请注意,与其检查 是否item出现在 上的任何位置@browser.text,不如检查特定的内容 - 例如,您是否希望它出现在链接文本、搜索结果的简介等中。检查任何地方的问题是它可能导致误报。例如,如果item是“搜索”,你总是会得到真实的,因为底部的链接有那个词。但你真的想看看它是否在搜索结果中。

于 2013-06-08T00:42:24.153 回答