通过PageFactory传递参数

时间:2013-10-28 07:12:31

标签: watir page-object-gem

我正在使用带有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但没有运气。

1 个答案:

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

  1. 如果在评估页面对象类时已知该值,则使用字符串插值。
  2. 如果要在访问时动态指定值,请使用ERB。
  3. 工作示例

    以下是动态参数的工作示例。

    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