Ruby on rails 为什么水豚说节点过时了?如何解决?

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) 我已经做了相当多的调试。在查找和执行脚本行之间放置调试器

我有一个spec/capybara测试,它搜索一个元素,然后尝试运行JS脚本将该元素滚动到视图中。然而,Capybara声称,当节点尝试运行JS时,它已经过时了。 有争议的行是连续的。这是:

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