我正在使用黄瓜和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
但它也不起作用。 请建议一种方法,即由于空数组而执行步骤定义并且不会通过。
答案 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