gpt4 book ai didi

ruby-on-rails - 为什么 capybara 说节点已过时以及如何解决?

转载 作者:行者123 更新时间:2023-12-04 04:23:31 25 4
gpt4 key购买 nike

我有一个规范/ capybara 测试,它搜索一个元素,然后尝试运行一个 JS 脚本来将元素滚动到 View 中。但是,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']")

最佳答案

在不知道页面上发生了什么的情况下,无法准确说明为什么会出现“过时节点”错误,但该错误表明最初找到的节点已不在页面中。如果您访问一个新页面,如果包含该节点的页面部分被 JS 替换等,就会发生这种情况。

路过visible: false然后尝试将该元素滚动到页面中没有意义,因为如果该元素不可见,那么您将永远无法将其滚动到 View 中( visible 表示在页面上绘制,并不意味着'在视口(viewport)中')。

您的代码的其他问题是

  • 您不应该调用特定于驱动程序的 execute_script , 而只是使用 Capybara session execute_script (通常如果你使用 Capybara.current_session.driver.browser 你做错了什么)。
    page.execute_script(script, element)
  • Capybara 已经提供了一个 scroll_to 所以使用它而不是自己编写
      page.scroll_to(page.find(selector)) # Defaults to scrolling to the top

    如果您需要控制元素的对齐方式,只需传递 :align 选项
      page.scroll_to(page.find(selector), align: :center) # :top, :bottom, :center
  • 关于ruby-on-rails - 为什么 capybara 说节点已过时以及如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58519126/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com