2013-05-18 133 views
1

我需要在网站上抓取一些信息,该网站上有一个表格,每行包含一个链接。watir打开页面的每个链接

我想要点击表中的每个链接,从生成的页面中获取一些信息并返回到上一页。

t = browser.table(:class => "tblElencoProdotti") 

t.links(:class => "TXT10b").each do |l| 
    l.click 
    #do some stuff 
    browser.back 
end 

不幸的是,后面的动作使我对“文档已到期此文档不再可用”错误。

如果我手动在我的默认ff会话上执行操作并点击后退箭头,但如果我在watir打开的窗口中执行此操作,则不起作用。

+0

FF可能依靠其缓存。如果在FF中手动返回后单击“刷新”,则可能会看到此内容。 –

+0

如果出现上述情况,您必须通过在页面中存储您需要的内容来实现自己的“缓存”,而不是告诉WATIR重新获取它。 –

回答

3

你为什么需要每次点击浏览器并返回浏览器?

为什么不存储所有的链接,然后访问逐一:

browser.table(:class => "tblElencoProdotti"). 
    links(:class => "TXT10b").map(&:href). 
    each { |url| browser.goto url } 

更新

如果链接仅是因为JavaScript magic点击,然后再尝试这样的事:

links_count = browser.table(:class => "tblElencoProdotti").links(:class => "TXT10b").size 
links_count.times do |index| 
    browser.table(:class => "tblElencoProdotti").links(:class => "TXT10b")[index].click 
    browser.back 
end 

此解决方案应清除缓存。我不确定,但也许有一些更好的方法来重新定位所有内容,而不是依赖已经缓存的元素。

+0

这是所有的JavaScript,我还没有弄清楚它是如何工作的,所以点击它是我必须到达我需要的页面的唯一途径。 – TopperH

+0

更新了我的答案。 –

0

您可以尝试此示例代码以访问特定表中的所有链接,并在访问页面上执行任何操作。

links = Array.new 
    ii = 0 
    browser.table(:class => "tblElencoProdotti").links.each{|li| 
     link = Struct.new(:href, :text) 
     links[ii] = link.new(li.href, li.text) 
     ii = ii + 1 
    }   

    links.each { |li|   
       browser.goto(li.href)     
       #Do your stuff     
    } 
相关问题