0

我是红宝石新手(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
4

3 回答 3

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    
于 2013-09-27T11:04:54.460 回答
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 略有不同。

于 2013-09-25T13:03:37.423 回答
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')

这更简洁 - 对页面的访问被抽象为应该增加一些业务价值的方法。

- 芝士

于 2013-09-25T20:53:52.983 回答