我正在使用带有watir和RSpec的page-object gem来测试我的Web应用程序。 这是我的页面对象。
require 'page-object'
class UserEditPage
include PageObject
page_url "#{$context}/user/edit?id=#{@params[:id]}"
text_field :user_id, name: 'userName'
text_field :pw, name: 'password'
text_field :pw_retype, name: 'password2'
# snip uninteresting stuff
button :submit, index: 0
end
我想通过:id
通过page_url
参数化PageObject::PageFactory
,如下所示:
visit UserEditPage, using_params: {id: 1000} do |page|
# operation on page
end
This document意味着上述用法是可能的,但我无法理解这是如何实现的。
问题:如何将参数id
从访问方法传递到UserEditPage
?
运行代码导致
***/user/edit_page.rb:8:in `<class:UserEditPage>': undefined method `[]' for nil:NilClass (NoMethodError)
from ***/user/edit_page.rb:5:in `<top (required)>'
可能因为@params
在评估page_url时为零。
将using_params: {id: 1000}
更改为id: 1000
但没有运气。
答案 0 :(得分:4)
page_url
需要:
page_url "#{$context}/user/edit?id=<%=params[:id]%>"
请注意参数需要以不同方式包含 - 即<%=params[:id]%>
而不是#{params[:id]}
。
问题是在评估页面对象类时会评估page_url
。这意味着在评估类时,params [:id]必须已经存在。当您想要动态包含参数时,情况并非如此。
页面对象gem使用ERB来创建模板,允许稍后替换params - 即调用visit
时。
总之,在创建page_url
:
工作示例
以下是动态参数的工作示例。
require 'watir-webdriver'
require 'page-object'
$context = 'http://testurl.com'
class UserEditPage
include PageObject
page_url "#{$context}/user/edit?id=<%=params[:id]%>"
end
include PageObject::PageFactory
@browser = Watir::Browser.new
visit UserEditPage, using_params: {id: 1000} do |page|
p page.current_url
#=> "http://testurl.com/user/edit?id=1000"
end