为什么基于Cheezy的pageObject不起作用?

时间:2013-09-25 06:11:06

标签: page-object-gem

我是ruby的新手(1.9.3)

我有Selenium WebDriver和C#的中级经验。我想转到Watir-Webdriver。

我很想知道为什么第一个IRB代码块工作,但第二个块只是加载正确的页面,然后什么都不做。页面处于活动状态并响应手动输入。

第二个代码块基于此处的PageObject示例: https://github.com/cheezy/page-object/wiki/Get-me-started-right-now%21

require 'watir-webdriver'
browser = Watir::Browser.start 'http://x.com/'
browser.select_list(:id, "ddlInterestType").select("Deferred")
browser.select_list(:id, "ddlCompanyName").select("XYZ")
browser.button(:value,"Enter Transactions").click

第二块

require 'watir-webdriver'
browser = Watir::Browser.new :firefox
browser.goto "http://x.com/"
deferredPage = DeferredPage.new(browser)
deferredPage.interestType.select = 'Deferred'
deferredPage.company.select = 'XYZ'
deferredPage.enterTransactions
class DeferredPage
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end

3 个答案:

答案 0 :(得分:1)

在页面对象代码示例中,加载页面后,可能会抛出异常(这似乎没有任何反应)。该代码应抛出一个无方法异常:

undefined method `select=' for "stuff":String

声明选择列表时,会创建三种方法:

  • your_select= - 这是用于设置选择列表
  • your_select - 这是用于获取选择列表值
  • your_select_element - 这是用于获取页面对象的gem元素

执行deferredPage.interestType时,它会返回一个字符串,该字符串是选择列表的值。字符串没有select=方法,这就是您获得异常(并且什么都不做)的原因。

这两项选择应该在没有.select的情况下完成:

deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'

正如您所看到的,页面对象API与watir API略有不同。

答案 1 :(得分:1)

在谷歌搜索页面对象的信息时,我发现了Alister Scott的这个页面。 :

http://watirmelon.com/2012/06/04/roll-your-own-page-objects/

对于像我这样的白痴++,我想我会使用他的方法,直到我对Watir-Webdriver了解更多。基于@ justinko的评论,我将坚持目前的一个API。我尝试自己滚动,它工作正常:

require 'watir-webdriver'
browser = Watir::Browser.new :ie

class DeferredPage
  def initialize( browser )
    @browser = browser
  end

  def enterIntType(intType)
    @browser.select_list(:id, "ddlInterestType").select(intType)
  end

  def clickEnter()
    @browser.button(:value,"Enter Transactions").click
  end
end

dp = DeferredPage.new(browser)

browser.goto "http://x.com"

dp.enterIntType( "Deferred" )
dp.clickEnter    

答案 2 :(得分:0)

您能否告诉我们您的错误是什么?我怀疑你看到的问题与Ruby解释器读取代码的方式有关。它从上到下读取文件,并在定义之前使用DeferredPage类。如果您将代码更改为此内容会发生什么:

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'
deferredPage.enterTransactions

在这种情况下,我在使用它之前声明了该类。

我可能建议的另一件事是创建更高级别的方法来执行数据输入。例如,您可以将代码更改为:

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject

  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')

  def do_something(interest, company)
    self.interestType = interest
    self.company = company
    enterTransactions
  end
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.do_someting('Deferred', 'XYZ')

这更清晰 - 在一个应该增加一些商业价值的方法背后抽象对页面的访问。

-Cheezy