我有一些像这样的<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
它显示了终端窗口中第一个循环的所有链接。
答案 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