Регистрация бота - PullRequest
       2

Регистрация бота

3 голосов
/ 09 апреля 2020

Привет, я хотел бы написать регистрационного бота.

Я использую селен с python, и в начале я столкнулся со следующей проблемой.

elems = driver.find_elements_by_xpath("//a[@href]")
    for elem in elems:
        elem_ = elem.get_attribute("href")
        regex = re.compile('signup')
        match = re.search(regex, elem_)
        if match:
            print(elem_)
            elem.click()

, с которой я могу найти регистрационную ссылку, но когда я пытаюсь щелкнуть ее это дает мне:

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

Я плохо получаю доступ к элементу? как выполнить функцию щелчка по элементу из списка, созданного find_elements_by_something?

1 Ответ

1 голос
/ 09 апреля 2020

То, как вы выполняете функцию click , является правильным: функция find_elements возвращает список WebElements , и вы вызываете click функция одного из его элементов. Проблема находится в другом месте.

Документы: Исключение ссылки на устаревший элемент

Исключение ссылки на устаревший элемент выдается в одном из двух случаев, первое является более распространенным чем второй:

Элемент был полностью удален.

Элемент больше не присоединен к DOM.

Как видите, исключение выдается момент, когда селен не может найти элемент в структуре DOM.

Общего решения c этой проблемы не существует, так как оно зависит от веб-страницы, с которой вы работаете.

Обычно такого рода проблемы возникают в dynamici c pages , где, как следует из названия, структура DOM генерируется динамически.

Как просто это может показаться общим решением - это попытаться снова, просто окружив его блоком try и повторно выполнить код:

from selenium.common.exceptions import StaleElementReferenceException

try:
    ...
except StaleElementReferenceException:
    ...

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

from selenium.webdriver.common.action_chains import ActionChains

elem = driver.find_element(By.TAG_NAME, 'body')
ac = ActionChains(driver)
ac.move_to_element(elem).move_by_offset(x_offset, y_offset).click().perform()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...