我正在使用带有 watir 和 RSpec 的页面对象 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
我想通过 PageObject::PageFactory
参数化 page_url
中的 :id
,如下所示:
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)>'
可能是因为在评估 page_url 时@params
为零。
将 using_params: {id: 1000}
更改为 id: 1000
但没有成功。
最佳答案
page_url
需要是:
page_url "#{$context}/user/edit?id=<%=params[:id]%>"
请注意如何以不同方式包含参数 - 即 <%=params[:id]%>
而不是#{params[:id]}
.
问题是page_url
当评估页面对象类时评估。这意味着当评估该类时,params[:id] 必须已经存在。当您想要动态包含参数时,情况就不是这样了。
页面对象 gem 使用 ERB 来允许您创建模板,该模板允许稍后替换参数 - 即在调用 visit
时.
总之,当创建page_url
时:
- 如果在评估页面对象类时已知值,则使用字符串插值。
- 如果要在访问时动态指定值,请使用 ERB。
工作示例
下面是动态参数的工作示例。
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
关于watir - 通过PageFactory传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19628948/