如何判断页面上是否存在元素?
该页面有一个链接:
<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
以上:上课是有目的的错,它应该等于&#34; twitter&#34; (就像上面的HTML一样),但是当我打电话给twitter_link?
时,该步骤仍然通过并且不会失败。
当我在.exists?
上拨打twitter_link
时,测试失败,这是正确的:
def element_exists?
puts @browser.url
twitter_link.exists?
end
当我这样做时,也出现了期望的结果:
def element_exists?
puts @browser.url
twitter_link?.should == true
end
当我自己致电twitter_link?
时,有人知道为什么会通过吗?根据页面对象gem文档,应该有一种方法来检查开箱即用的存在。这是指检查页面类中是否存在而不是实际页面本身?这就是它的表现。
答案 0 :(得分:3)
问题是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 }