Как работать с автообновлением страниц при работе скрипта со списком - PullRequest
0 голосов
/ 17 октября 2019

У меня есть скрипт Python / Selenium, работающий через страницу, и, чтобы не спамить сервер, я сплю полсекунды между взаимодействиями с элементами страницы. Я заметил проблему, когда скрипт «потерял отслеживание» элементов в моем списке, и совсем недавно обнаружил, что это происходит из-за автоматического обновления / сброса страницы во время выполнения скрипта. Идентификаторы, по-видимому, генерируются динамически, поэтому обновление обычно изменяет некоторые идентификаторы, и сценарий вылетает.

Когда я впервые столкнулся с проблемой, я просто включил в нее try-catch, пропуская элементы, которые у него былипотерял учет и записал ошибку, так как у меня не было никакой реальной информации по этой проблеме, и это было нечасто.

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

Лучшая идея, которая мне пришла в голову, ниже, где я полностью перезагружаю страницу и обновляю список MID-LOOP и начинаю заново. Это явно неправильный способ решения этой проблемы. Какой вариант лучше?

        try:
            browser.execute_script("arguments[0].click();", button)
        except link_lost:
            print('Lost track of something...')
            browser.refresh() # Page glitch fix. Refresh, relocate buttons, start over.
            browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(5) # could be optimized by keeping track of which question we're on and starting from there
            target_buttons = browser.find_elements_by_css_selector('[aria-label=target]')

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете легко сделать это, используя функции селена:

  1. найти отдельный элемент списка и затем перейти к первому элементу, который хочет щелкнуть
  2. , используя нужный элемент поиска xpathщелкнуть, сохранить как переменную

пример:

add_button = driver.find_elements_by_xpath('//button[contains(text(), "Dodaj")]')
contact_field = add_button[0].find_elements_by_xpath('.//parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*')
name_of_contact = contact_field[0].find_element_by_xpath('.//div/div/div/div/div/a')
например, name_of_contact - это ваша переменная, а contact_field - это отдельный элемент, такой как список или окно. теперь просто используйте contact_field [0] .click (), и независимо от того, что произойдет, он всегда будет первым элементом из этогоlist. выше вы видите его с двух сторон, add_button - это элемент на странице, используя его, я нахожу parrent-элемент contact_field, где была вся информация, затем нахожу подходящего потомка (name_of_contact)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...