我有一个spec / capybara测试,该测试搜索一个元素,然后尝试运行JS脚本以将该元素滚动到视图中。但是,Capybara声称该节点在尝试运行JS时已过时。所讨论的行是连续的。他们在这里:
element = page.find(selector, visible: false)
Capybara.current_session.driver.browser.execute_script(script, element.native)
我已经做了相当多的调试。在find
和execute_script
行之间放置调试器时,调用element
实际上会返回一个过时的节点Obsolete #<Capybara::Node::Element>
。
在调试器中运行page.find(selector, visible: false)
不会返回陈旧的节点,而是您希望#<Capybara::Node::Element tag="div" path="/HTML/BODY[1]/DIV[6]/DIV[2]/DIV[1]/DIV[1]/DIV[54]">
的正常活动节点>
此外,删除这两行并在调试器中手动运行它们会看到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']")
我有一个spec / capybara测试,该测试搜索一个元素,然后尝试运行JS脚本以将该元素滚动到视图中。但是,水豚声称该节点在尝试时已过时...
[不知道页面上正在发生什么,无法确切地说出为什么会出现“过时的节点”错误,但是该错误表明最初找到的节点不再在页面中。如果您访问新页面,或者页面的包含该节点的部分被JS等替换,则可能会发生这种情况。