刷新 Capybara 的会话 DOM 内容

Refresh Capybara's session DOM contents

我正在尝试使用 Selenium/Capybara 解析网站。现在看起来像这样:

session = Capybara::Session.new(:selenium)

session.visit "https://somesite.com/page1"

element = session.all( :css, '.table .row a' ).each do |el|
  el.click

  # get some element's data

  session.evaluate_script('window.history.back()')
end

# repeat

问题是,当我试图从我所在的第二页获取数据时,Capybara 告诉我 Either the element is no longer attached to the DOM or the page has been refreshed. 这绝对有道理,但是我正在努力寻找一种方法来创建一个新的 DOM 变量并在文档中对其进行解析。

如果我返回尝试重复操作并连续单击第二个 link,则会发生同样的事情。我假设我需要重新创建会话或者是否有更好的方法?

要像您尝试的那样工作,您将需要保留一个计数器并在每次循环中查找元素 - 类似于

counter = 0
while (el = session.all( :css, '.table .row a', minimum: 1 )[counter]) do
  el.click

  # get some element's data

  counter += 1
  session.go_back
end

或者如果链接只是标准链接,您可以收集 href,然后访问它们

element = session.all( :css, '.table .row a', minimum:1 ).map {|a| a['href']} do |url|
  session.visit(url)

  # get some element's data

end