Ruby on rails 为什么水豚说节点过时了?如何解决?
我有一个spec/capybara测试,它搜索一个元素,然后尝试运行JS脚本将该元素滚动到视图中。然而,Capybara声称,当节点尝试运行JS时,它已经过时了。 有争议的行是连续的。这是:Ruby on rails 为什么水豚说节点过时了?如何解决?,ruby-on-rails,selenium,capybara,Ruby On Rails,Selenium,Capybara,我有一个spec/capybara测试,它搜索一个元素,然后尝试运行JS脚本将该元素滚动到视图中。然而,Capybara声称,当节点尝试运行JS时,它已经过时了。 有争议的行是连续的。这是: element = page.find(selector, visible: false) Capybara.current_session.driver.browser.execute_script(script, element.native) 我已经做了相当多的调试。在查找和执行脚本行之间放置调试器
element = page.find(selector, visible: false)
Capybara.current_session.driver.browser.execute_script(script, element.native)
我已经做了相当多的调试。在查找
和执行脚本
行之间放置调试器时,调用元素
确实会返回一个过时节点过时
在调试器中运行page.find(选择器,可见:false)
不会返回过时节点,而是返回您期望的正常活动节点
此外,删除这两行并在调试器中手动运行它们可以看到capybara正确地找到DOM元素,正确地运行JS,并且规范通过
有关守则:
def scroll_to(selector, align = true)
if align
script = <<-JS
arguments[0].scrollIntoView(true);
JS
else
script = <<-JS
arguments[0].scrollIntoView(false);
JS
end
element = page.find(selector, visible: false)
Capybara.current_session.driver.browser.execute_script(script, element.native)
end
scroll_to(".xdsoft_time[data-hour='13'][data-minute='15']")
def滚动到(选择器,align=true)
如果对齐
script=如果不知道页面上发生了什么,就不可能确切地说出为什么会出现“过时节点”错误,但该错误表示最初找到的节点已不在页面中。如果您访问一个新页面,如果页面中包含该节点的部分被JS等替换,就会发生这种情况
传递visible:false
然后尝试将该元素滚动到页面中是没有意义的,因为如果该元素不可见,则您将永远无法将其滚动到视图中(visible
表示在页面上绘制,而不是“在视口中”)
代码的其他问题包括
您不应该调用特定于驱动程序的execute\u script
,而应该只使用Capybara会话execute\u script
(通常,如果您使用的是Capybara.current\u session.driver.browser,则说明您做错了什么)
水豚已经提供了一个卷轴,所以用它来代替你自己写
page.scroll_to(page.find(selector)) # Defaults to scrolling to the top
如果需要控制图元的对齐方式,只需传递:align选项
page.scroll_to(page.find(selector), align: :center) # :top, :bottom, :center
page.scroll_to(page.find(selector), align: :center) # :top, :bottom, :center