为什么水豚说节点过时了,怎么解决?

问题描述 投票:0回答:1

我有一个spec / capybara测试,该测试搜索一个元素,然后尝试运行JS脚本以将该元素滚动到视图中。但是,Capybara声称该节点在尝试运行JS时已过时。所讨论的行是连续的。他们在这里:

element = page.find(selector, visible: false)
Capybara.current_session.driver.browser.execute_script(script, element.native)

我已经做了相当多的调试。在findexecute_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脚本以将该元素滚动到视图中。但是,水豚声称该节点在尝试时已过时...

ruby-on-rails selenium capybara
1个回答
0
投票

[不知道页面上正在发生什么,无法确切地说出为什么会出现“过时的节点”错误,但是该错误表明最初找到的节点不再在页面中。如果您访问新页面,或者页面的包含该节点的部分被JS等替换,则可能会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.