Watir,Page-objects:如何获取具有相同标识符的所有元素

时间:2013-06-24 13:28:22

标签: webdriver watir-webdriver page-object-gem

我想在网页上找到以下代码:

...    
<p class="tags-link"> 
<a href="/search?q=test1" rel="nofollow">test1</a>
<a href="/search?q=test2" rel="nofollow">test2</a> 
<a href="/search?q=test3" rel="nofollow">test3</a>
</p>
....
<p class="tags-link"> 
<a href="/search?q=test4" rel="nofollow">test4</a>
<a href="/search?q=test5" rel="nofollow">test5</a> 
<a href="/search?q=test6" rel="nofollow">test6</a>
</p>

...

我使用Watir-webdriver和page-object。我需要通过“tags-link”类获取与块相关的所有链接。

我有以下代码:

element(:tags, :p, :css => "tags-link a")

tags_element仅返回第一个链接。

以下代码将仅提供与第一个块相关的3个链接:

element(:tags, :p, :css => "tags-link")
tags_element.element.links.each do |elm|
  puts elm
end

但我需要获得所有标签块

现在我有以下代码可行,但我想成为“页面对象”:

@browser.elements(:css =>".tags-link a").each do |tag|
  puts tag
end

你能帮助我......使用页面对象获取页面上与“tags-link”相关的所有链接

谢谢, 安娜

2 个答案:

答案 0 :(得分:6)

您可以使用links

在页面对象中定义链接集合
class MyPage
    include PageObject

    links(:tag_link, :css =>".tags-link a")
end

这将创建一个collection_name_elements方法,该方法返回一组匹配的页面对象元素。您可以迭代它以对每个元素执行操作。例如,要输出每个链接的文本:

page.tag_link_elements.each do |link|
    puts link.text
end
#=> test1
#=> test2
#=> test3
#=> test4
#=> test5
#=> test6

答案 1 :(得分:2)

这就是你需要做的所有事情:

ary_of_tests = @browser.ps(:class, 'tag-links').map do |t|
    t.as.map do |x| 
        x.text 
    end 
end
=> [["test1", "test2", "test3"], ["test4", "test5", "test6"]]

如果你不喜欢动态数组,你总是可以使用flatten方法使它成为一维或to_s方法,使其成为一个字符串。定义一个新类并指定场景对我来说似乎有些过分,但对他自己来说似乎有点过分了。

注意:ps(:class,'tag-links)是所有p元素的集合,在给定页面的DOM中具有属性类和值标记链接。