如何使用watir-webdriver访问循环中链接数组的href

时间:2016-09-05 02:19:00

标签: ruby selenium selenium-webdriver watir watir-webdriver

我有一些像这样的<a>个元素:

array = browser.as(:class => 'foo')

我尝试转到这样的链接:

$i = 0
while $i < num do
    browser.goto array[$i].href
    .
    .
    .
    $i += 1
end

哪个适用于第一个循环,但不适用于第二个循环。为什么会这样?如果我做

puts array[1].href
puts array[2].href
puts array[-1].href

browser.goto array[$i].href

它显示了终端窗口中第一个循环的所有链接。

2 个答案:

答案 0 :(得分:3)

比我更了解这一点的人需要验证/澄清。我的理解是,在加载页面时,元素会被赋予参考。在加载新页面时,您正在构建所有新引用,即使它看起来像每个页面上的相同链接。

您正在存储对该元素的引用,然后要求它继续并从中拉出href属性。它第一次工作,因为元素仍然存在。一旦新页面加载,它就不再存在。拉取属性的请求失败。

如果您关心的只是hrefs,那么更短的,更Ruby的方式。

array = []

browser.as(:class => 'foo').each { |link|
  array << link.href
}

array.each { |link| 
  browser.goto link
}

通过将链接塞进阵列,我们不必担心陈旧的引用。

答案 1 :(得分:2)

是的,与存储定位器的单个元素不同,并且会在页面重新加载时重新查找它们,元素集合仅存储无法重新查找的Selenium元素。

当您需要此模式而不仅仅是一个href值时,另一个解决方案是不创建集合并使用带索引的单个元素:

num.times do |i|
  link = browser.link(class: 'foo', index: i)
  browser.goto link.href
end