无法使用PageObject和Watir

时间:2016-04-07 18:48:42

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

我收集了一个数组:

array= @browser.ul(:class => 'parent').links

然后我尝试访问数组中特定元素的文本,迭代数组,如下所示:

array.each_with_index do |i, index|

如果我这样做:

array[index]

我找回了锚元素对象。如果我这样做:

array[index].element

我将找回一个HTML元素对象。但是,如果我尝试获得任何特定元素,例如:

array[index].text
array[index].value

然后我收到“无法定位元素”错误。

我正在使用Watir,Page Object和Ruby。

这是整个数组迭代的范围,它非常简单:

array= @browser.ul(:class => 'parent').links
array.each_with_index do |i, index|
  if index == array.length-1
    sleep 1
    @browser.button(:text => 'Complete').when_present.click
  else
    sleep 1
    @browser.button(:text => 'Complete').when_present.click
    @browser.a(:text => 'Next').when_present.click
  end
end

我正在尝试添加一个检查链接文本的elsif,这样如果它位于该特定页面/链接上,它会在该页面上执行特定的操作。

例如,在伪代码中:

  

如果数组元素text =“说明”,则不要单击完整按钮,只需单击“下一步”。

我想我会开放以任何方式解决这个问题,让我识别它当前所处的链接,以便我可以执行设置动作,但我认为抓取当前链接的文本将是最简单的,因此这个问题。

如何访问此数组中元素的文本或特定属性?

2 个答案:

答案 0 :(得分:1)

您的元素的DOM很可能在进行一些互动后发生变化(例如点击“完成”按钮)。

我的建议是在每次互动后再次找到所有元素。

尝试类似的东西:

array = @browser.ul(:class => 'parent').links
index = 0
array.length.times do
  sleep 1
  if index == array.length-1
    @browser.button(:text => 'Complete').when_present.click
    array = @browser.ul(:class => 'parent').links #We are finding new array after possible change
  elsif  array[index].text == 'Instructions'
    @browser.a(:text => 'Next').when_present.click
  else
    @browser.button(:text => 'Complete').when_present.click
    @browser.a(:text => 'Next').when_present.click
  end
  array = @browser.ul(:class => 'parent').links #And once again
  index = index+1
end

注意:我不能保证上面的代码能够正常工作,因为我没有任何页面可以测试它以确保。如果它不起作用 - 尝试使用想法修改它

答案 1 :(得分:1)

迭代一个链接列表,只是提取它们的信息非常简单,只要DOM没有改变就应该可靠地工作。一旦您开始点击内容或采取导致部分或全部页面更新的操作,所有投注都将被取消,因为您的集合可能包含对UI中已删除或替换的元素的引用。

你似乎对.each迭代器的工作方式感到有些困惑。该方法的基本形式依次返回集合中的每个对象。 with_index版本返回每个对象及其在数组中的索引。在大多数情况下,除非您关心索引是什么,否则不会使用with_index表单。

例如,要遍历您的收藏并输出每个链接的文本,您只需执行

即可
links_list = @browser.ul(:class => 'parent').links
links_list.each do |link|
  puts "the link text is: #{link.text}"
end

如果您想指出每个链接的索引,那么您可以

links_list = @browser.ul(:class => 'parent').links
links_list.each_with_index do |link, index|
  puts "the text for link number #{index} is: #{link.text}"
end

如果您希望通过这样的链接列表和做事情,可能会导致页面更新,那么您最好使用其他方式中提供的策略回答你根据列表的大小创建循环的地方,但重新获取循环内的列表,以便它始终是新鲜的#39;并且不可能包含对不再在DOM中的对象的引用。