Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 已加载内容的Selenium的StaleElementReferenceError_Ruby_Selenium_Capybara - Fatal编程技术网

Ruby 已加载内容的Selenium的StaleElementReferenceError

Ruby 已加载内容的Selenium的StaleElementReferenceError,ruby,selenium,capybara,Ruby,Selenium,Capybara,为了从网站上获取信息,我在Ruby 1.9.3中使用Capybara,并使用selenium驱动程序。点击几页后,我访问了我想要的页面,并将: all(:css, 'td').each { |td| a_info << td } a_info.each {|t| puts t.text } 跟踪了更多的远程服务器错误。我给了页面10-30秒的睡眠时间,但它仍然没有加载,当我打印page.html时,我看到一个javascript脚本,然后是我试图从中获取信息的所有td。我知道这

为了从网站上获取信息,我在Ruby 1.9.3中使用Capybara,并使用selenium驱动程序。点击几页后,我访问了我想要的页面,并将:

 all(:css, 'td').each { |td| a_info << td }
 a_info.each {|t| puts t.text }

跟踪了更多的远程服务器错误。我给了页面10-30秒的睡眠时间,但它仍然没有加载,当我打印page.html时,我看到一个javascript脚本,然后是我试图从中获取信息的所有td。我知道这个错误意味着找到的元素不是当前的元素,但似乎所有的元素都已经加载了,所以我不确定它们为什么不再存在。我已经在互联网上搜索了几个小时寻找这个问题,我希望能从可能的解决方案中得到任何帮助,并尝试下一步的解决方案。我可以提供任何需要的额外信息,只要告诉我。

这是我最不喜欢的错误。我想让你们参考一年前提出的关于堆栈溢出的问题,在呈现的代码中,你们在控制台上打印文本,但在真实代码中,你们可能在每个循环中点击了这些链接,这是错误的

解决方案

首先尝试提取href属性,然后在循环中遍历它们。 代码:


我不确定它是否适合您的情况,请在评论中提供更多信息。

例如,当您创建一个范围并将其更改为页面时,会发生这种情况,但会在其中不断做出断言,如下所示:

within 'selector' do
  expect(page).to have_link 'Link'

  visit 'page'

  expect(page).to have_link 'I do not know this whitin, I am stale.'

  find('I do not know this within, I am stale.').click
end
只要重新打开你的范围,继续旧的工作

within 'selector' do
  expect(page).to have_link 'Link'
end

visit 'page'

within 'selector' do
  expect(page).to have_link 'Now i am fresh'

  find('#now-i-am-fresh').click
end

这是我放在那里的真实代码。我并没有试图去关注链接,只是从一个页面上收集信息。也许一些javascript被执行了,但并没有你们在上一步收集到的所有td。为什么不先在每个方法中收集td.text?这些答案没有帮助,因为我不是在等待某个元素,我只是试图从已经加载的页面中获取所有td元素。这就是为什么我对该做什么感到困惑的原因;这会给你问题的原因。以下是您遇到的错误的定义:。等待30秒对你没有帮助。可能尝试隐式等待,或者修改代码以查找td元素,放下文本,然后移动到下一个td。或者,如果您喜欢使用某种html解析器来查找您的信息。硒不是你想要做的最好的工具。这为我解决了它。这与中的
有关。这正是我的情况。测试试图等待模态在模态范围内关闭。断言基本上是无意义的(总是错误的),但是如果模态关闭得太快,该断言就会触发此异常。一定是由重构引入的。没有selenium,我也遇到了同样的问题,只是使用了capybara:always得到了一个capybara::RackTest::Errors::StaleElementReferenceError。关闭范围解决了它。
within 'selector' do
  expect(page).to have_link 'Link'

  visit 'page'

  expect(page).to have_link 'I do not know this whitin, I am stale.'

  find('I do not know this within, I am stale.').click
end
within 'selector' do
  expect(page).to have_link 'Link'
end

visit 'page'

within 'selector' do
  expect(page).to have_link 'Now i am fresh'

  find('#now-i-am-fresh').click
end