как исправить «Устаревшую ошибку элемента в ruby selenium»

#ruby #selenium #webdriver #watir

Вопрос:

Я получаю устаревшую ошибку элемента в следующем коде, когда он пытается щелкнуть элемент row.find_element(:xpath, "//*[@id='batch']/div[1]/table/tbody/tr[#{index}]//td[5]/form/input[3]").click()

 def traverse_batch
  driver.find_elements(:xpath, "//*[@id='batch']/div[1]/table/tbody/tr").each.with_index(1) do |row, index|
    row.find_elements(:xpath, "//*[@id='batch']/div[1]/table/tbody/tr[#{index}]/td").each do |td|
      sleep(5)

      if td.text() == 'started'
        while td.text() == /^success/ do
          driver.navigate.refresh()
        end
      end

      if row.find_element(:xpath, "//*[@id='batch']/div[1]/table/tbody/tr[#{index}]//td[5]/form/input[3]").displayed?
        row.find_element(:xpath, "//*[@id='batch']/div[1]/table/tbody/tr[#{index}]//td[5]/form/input[3]").click()
      end
    end
  end
end
 

Комментарии:

1. вы должны повторно найти элементы после изменения DOM , обновление страницы изменяет DOM

2. Спасибо PDHide. Но я новичок в кодировании. Я не знаю, куда добавить код для уточнения элемента в моем коде. Мне нужно обновить страницу, чтобы увидеть, отображается ли кнопка «возобновить».

3. Вот почему нужно использовать WATIR, WATIR-это оболочка вокруг привязки рубинового селена. В ВАТИРЕ вы бы не столкнулись с проблемой устаревшего элемента. WATIR автоматически восстановит элемент из DOM.

4. Спасибо тебе, Раджагопалан.

5. Вероятно, на странице есть какой-то код JS, который обновляет страницу после обновления, поэтому страница все еще находится в движении сразу после обновления. Вашему коду может потребоваться какой-то способ определить, что код JS завершил обновление DOM (или пауза грубой силы), чтобы он не пытался взаимодействовать, пока DOM все еще изменяется

Ответ №1:

Это подход, который вы используете больше, чем инструмент, который вы используете.

Вы находите список элементов, удаляетесь со страницы, а затем пытаетесь вернуться и использовать один из ранее найденных элементов.

Если это действительно тот маршрут, который вам нужно пройти, и вас не беспокоит изменение структуры таблицы при обновлении, вы можете просто собрать размеры всего и каждый раз находить конкретный элемент с индексами.

Вообще говоря, при обновлении: #find_element —> хорошо, #find_elements —>> плохо.