我是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
答案 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