У меня есть тест 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]">
Кроме того, при удалении двух строк и их запуске вручную в отладчике капибара правильно находит элемент 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']")