如何确保使用watir在页面上加载了同一类的多个元素?

时间:2013-11-12 11:14:32

标签: ruby cucumber watir watir-webdriver web-testing

我正在使用黄瓜和watir。问题是参考下面的代码:

When(/^I click on all 'Show more'$/) do
  @browser.links(:class, "more-matches").each do |d|
     if d.text == "Show more"
      d.click
     end
  end
end

现在,当测试用例达到此步骤定义时,测试用例显示为已通过而未单击使用@ browser.links(:class,“more-matches”)捕获的所有链接。 特定代码未实现可能是因为ajax调用尚未完成且数组包含零元素且不循环。如果我在此步骤定义的开头引入"sleep 2",则代码可以正常工作。任何人都可以告诉我如何通过添加代码来处理这种情况,以便ajax调用完成并且数组成功保存所有元素和循环。我也尝试添加代码:

if @browser.execute_script('return jQuery.active').to_i == 0

但它也不起作用。 请建议一种方法,即由于空数组而执行步骤定义并且不会通过。

1 个答案:

答案 0 :(得分:1)

使用Element#wait_until_present

通常,您会知道应该有多少链接。因此,您可以等到预期的链接数量。

When(/^I click on all 'Show more'$/) do
  # Wait for the expected number of links to appear
  #  (note that :index is zero-based, hence the minus 1)
  expected_number = 5
  @browser.link(:class => "more-matches", 
    :index => (expected_number-1)).wait_until_present

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end

如果您不知道预期会有多少链接,则会使确保一致性变得更加困难。但是,您可以通过检查至少存在一个链接来逃脱。希望如果有人在场,所有其他人都在场。

When(/^I click on all 'Show more'$/) do
  # Wait until at least one link appears
  @browser.link(:class => "more-matches").wait_until_present

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end

使用浏览器#wait_until

另一种方法是使用wait_until。等待至少5个链接可以重写为:

When(/^I click on all 'Show more'$/) do
  # Wait for the expected number of links to appear
  expected_number = 5
  @browser.wait_until do
    @browser.links(:class => "more-matches").length >= expected_number
  end

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end