Selenium перебирает элементы и нажимает на элемент, если он удовлетворяет определенному условию - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать веб-скребок и столкнулся с проблемой. Я пытаюсь перебрать элементы в левой части виджета, и если имя начинается с «а», я хочу нажать на знак минус и переместить его в правую часть. Мне удалось найти все элементы, однако, когда элемент перемещается вправо, выполняется его сторона, сразу после этого l oop Я получаю следующую ошибку.

    StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

(Информация о сеансе: chrome = 80.0.3987.163)

JS виджет.

1 Ответ

0 голосов
/ 17 апреля 2020

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

container = driver.find_elements_by_xpath('//*[@class="window_of_elements"]')
elements = container.find_elements_by_xpath('//*[@class="my_selected_class"]')
for e in elements:
    minus_part = e.find_element_by_xpath('//span[@class="remove"]')
    minus_part.click()

Когда вы нажимаете minus_part, контейнер вашего elements, вероятно, перерисовывается / перезагружается, и все ваши ранее найденные элементы поворачиваются stale.

Чтобы обойти это, вы должны попробовать другой подход:

container = driver.find_elements_by_xpath('//*[@class="window_of_elements"]')
to_be_removed_count = len(container.find_elements_by_xpath('//*[@class="my_selected_class"]'))
for _ in range(to_be_removed_count):
    target_element = container.find_element_by_xpath('//*[@class="window_of_elements"]//*[@class="my_selected_class"]')
    minus_part = target_element.find_element_by_xpath('//span[@class="remove"]')
    minus_part.click()

Так что в основном вы должны:

  • выяснить, сколько элементов вы должны найти, чтобы щелкнуть
  • в поиске для l oop и щелкнуть их по одному
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...