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

标签 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

上面的 :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/

相关文章:

ruby - Emacs ruby​​ 模式缩进行为

ruby-on-rails-3 - 无法让 Cucumber/Capybara 找到单选按钮

Ruby/Watir 从下拉菜单中选择一个选项

javascript - Rails 使用 Ajax 和acts_as_votable 进行赞成/反对

ruby - 在页面呈现给用户后运行代码 (Sinatra)

java - 如何在 cucumber java中获取场景名称?

java - Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

watir-webdriver - Watir::LI #attributes 方法未找到

webdriver - 静音 ChromeDriver.exe 日志记录

ruby - Ruby 中的无序耦合