我有一个 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']")