如何判断页面上是否存在元素?
该页面有一个链接:
<a class="twitter" href="h.....">twitter</a>
我的页面对象类是:
class Computer
include PageObject
link(:twitter_link, :class => "twitterrrrr")
def element_exists?
puts @browser.url
twitter_link?
end
end
此页面正在 Cucumber 步骤定义中使用:
Then /the elements should exist/ do
on(Computer).element_exists?
end
上面的 :class 是故意错误的,它实际上应该等于“twitter”(就像上面的 HTML),但是当我调用 twitter_link?
时,该步骤仍然通过并且没有失败。
当我在 twitter_link
上调用 .exists?
时,测试失败,这是正确的:
def element_exists?
puts @browser.url
twitter_link.exists?
end
当我这样做时,期望的结果也出现了:
def element_exists?
puts @browser.url
twitter_link?.should == true
end
有人知道为什么当我自己调用 twitter_link?
时它会通过吗?根据页面对象 gem 文档,应该有一种开箱即用的方法来检查是否存在。这是指检查页面类中是否存在而不是实际页面本身吗?这就是它看起来正在做的事情。
最佳答案
问题是 twitter_link?
只是返回 true 或 false。像 RSpec 和 Cucumber 这样的测试框架不会仅仅因为某些东西返回 false 而失败。它们仅在断言失败或发生异常时失败。
换句话说,您需要在断言中检查它,而不是仅仅调用 twitter_link?
方法。例如:
# Examples using should syntax
page.twitter_link?.should == true
page.twitter_link_element.should exist
# Examples using expect syntax
expect(page.twitter_link?).to be_true
expect(page.twitter_link_element).to exist
如果要检查一系列元素,可以创建一个元素名称数组,然后遍历它们。
elements = [:twitter_link]
elements.each { |x| self.send( "#{x.to_s}?").should == true }
请注意,在创建元素数组时,您不想使用 elements = [twitter_link]
。通过在数组中包含 twitter_link
,它将调用该方法来实际尝试单击链接。这就是为什么您需要改用字符串或符号之类的东西的原因。存储页面对象元素也是一种选择:
elements = [twitter_link_element]
elements.each { |x| x.exists?.should == true }
关于ruby - 为什么使用元素时测试通过?检查元素是否存在的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26939816/