【问题标题】:Cheezy's Page Object, get all text_fields defined inside PageCheezy的Page Object,获取Page内定义的所有text_fields
【发布时间】:2014-11-20 04:15:26
【问题描述】:

考虑这个简单的页面对象:

require 'watir-webdriver'
require 'page-object'

class SomePage
  include PageObject

  text_field :first_name, :name => "fname"
  text_field :last_name, :name => "lname" 
  text_field :birth_date, :name => "birthday" 
  button :submit, :type => "submit"
end

browser = Watir::Browser.new

page = SomePage.new(browser)

有没有办法遍历所有文本字段(或任何元素)以访问它们的“标识符”(即:用户名、:密码或:出生)?

类似:

page.text_fields.each do |text_field|
  puts text_field.identifier.inspect
end

=> :first_name
=> :last_name
=> :birth_date

我只是想看看能不能转这个:

page.first_name = @user.first_name
page.last_name = @user.last_name
etc...

进入这个:

page.text_fields.each do |text_field|

  attribute = text_field.attribute

  text_field = @user[attribute]

end

有人知道我的意思吗?

【问题讨论】:

    标签: ruby watir page-object-gem


    【解决方案1】:

    已经提供的答案肯定会满足您的需求,但我想添加一个额外的选项,该选项使用页面对象 gem 中内置的功能。

    在 page_populator.rb 中调用 populate_page_with()。就是这样用的。

    从具有元素名称的散列开始(我使用加载到散列中的 CSV 文件),如您的页面对象中定义的键。哈希值包含您希望填充每个元素的值。

    form_data = {first_name: @user.first_name, last_name: @user.last_name, birth_date: @user.birth_date}
    
    @page.populate_page_with form_data
    

    就是这样。 populate_page 方法将在页面上找到正确的元素,并使用您在源哈希中设置的任何值填充它们。这适用于复选框、单选按钮和文本。

    这是 Cheezy 为我们提供的一个非常好的节省时间的方法!

    谢谢芝士!

    【讨论】:

      【解决方案2】:

      名称(:first_name, :last_name, :birth_date) 仅用于生成first_name=last_name=birth_date= 等方法名称。该名称不会存储或保留以供以后使用。

      也就是说,您可以遍历页面的实例方法来查找文本字段。以下text_fields 方法将:

      1. 获取所有类实例方法。
      2. 查找以“_element”结尾的方法。
      3. 创建一个包含元素名称和元素的数组。

      页面对象是:

      class SomePage
        include PageObject
        text_field :first_name, :name => "fname"
        text_field :last_name, :name => "lname" 
        text_field :birth_date, :name => "birthday" 
        button :submit, :type => "submit"
      
        def text_fields
          self.class.instance_methods(false)
            .grep(/_element$/)
            .map { |m| 
              element = self.send(m)
              [m[/(.+)_element$/, 1].to_sym, element] if element.kind_of?(PageObject::Elements::TextField)
            }.compact
        end
      end
      

      然后您可以通过访问文本字段的名称(或属性)和 TextField 元素来遍历文本字段:

      page = SomePage.new(browser)
      page.text_fields.each do |attribute, text_field|
        text_field.value = @user[attribute]
      end
      

      【讨论】:

        【解决方案3】:

        我做的正是“相反”:

        @user.each do | key, value |
          unless value.empty?
            browser.text_field(label: key).set value
          end
        end
        

        我为我拥有的数据而不是字段完成工作。它允许仅使用某些字段测试表单填充。

        【讨论】:

        • 为什么不用unless value.empty? 而不是if !value.empty?
        猜你喜欢
        • 2020-02-05
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多