使用元素时为什么测试通过?检查元素存在的方法?

时间:2014-11-14 22:20:09

标签: ruby cucumber watir-webdriver page-object-gem

如何判断页面上是否存在元素?

该页面有一个链接:

<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文档,应该有一种方法来检查开箱即用的存在。这是指检查页面类中是否存在而不是实际页面本身?这就是它的表现。

1 个答案:

答案 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 }
相关问题