2

我正在使用带有 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

我想通过这样的参数:id化:page_urlPageObject::PageFactory

visit UserEditPage, using_params: {id: 1000} do |page|
# operation on page
end

该文档暗示上述用法是可能的,但我不明白这是如何实现的。

问题:如何将参数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 时为 nil。更改using_params: {id: 1000}id: 1000没有运气。

4

1 回答 1

4

page_url需要是:

page_url "#{$context}/user/edit?id=<%=params[:id]%>"

请注意如何以不同方式包含参数 - 即<%=params[:id]%>而不是#{params[:id]}.

问题是在page_url评估页面对象类时会评估 。这意味着在评估类时, params[:id] 必须已经存在。当您想要动态包含参数时,这将不是真的。

页面对象 gem 使用 ERB 允许您创建模板,该模板允许稍后替换参数 - 即在调用visit.

总之,当创建一个page_url

  1. 如果在评估页面对象类时值已知,则使用字符串插值。
  2. 如果要在访问时动态指定值,请使用 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
于 2013-10-28T13:30:29.727 回答