复杂元素的 Watir 页面对象

Watir page object for complex elements

有这个html:

<div class = "account">
    <div class = "name"></div>
    <div class = "email"></div>
    <div class = "phone"></div>
</div>
<div class = "account">
    <div class = "name"></div>
    <div class = "email"></div>
    <div class = "phone"></div>
</div>
<div class = "account">
    <div class = "name"></div>
    <div class = "email"></div>
    <div class = "phone"></div>
</div>

我想创建一个包含帐户列表的页面对象,但由于我是 Ruby 和 watir 的新手,所以我不知道它会是什么样子。

这是帐户 class:

class Account
  def initialize(browser)
    @browser = browser
  end
  def user
    @browser.div(:class => "name")
  end

  def email
    @browser.div(:class => "email")
  end

  def phone
    @browser.div(:class => "phone")
  end
end

还有我需要帐户列表的页面对象

class Page 
  def initialize(browser)
    @browser = browser
  end

#here should be a list of accounts

end 

我假设您正在推出自己的页面对象框架(而不是询问如何在特定框架中执行此操作)。

我会创建一个 class 来表示一个帐户。这与您所拥有的相同,只是它假设您将传入一个元素(而不是浏览器)。此元素应代表所有帐户内容 - 即它期望 <div class = "account">。它的方法是寻找与该元素相关的内容。

class Account
  def initialize(element)
    @element = element # expected to be div.account
  end
  def user
    @element.div(:class => "name")
  end

  def email
    @element.div(:class => "email")
  end

  def phone
    @element.div(:class => "phone")
  end
end

在页面 class 中,您可以创建一个 #accounts 方法来 (1) 获取所有帐户 div 并 (2) 将它们包装在您的帐户中 class:

class Page
  def initialize(browser)
    @browser = browser
  end

  def accounts
    @browser.divs(class: 'account').map { |d| Account.new(d) }
  end
end

您对该页面的使用将是:

page = Page.new(browser)

# Inspecting the collection of accounts
page.accounts.count
#=> 3

# Inspecting a specific account (note the 0-based index)
page.account[1].user.text
#=> "<second accounts name>"