Выполнение для l oop через древовидную структуру - PullRequest
1 голос
/ 27 марта 2020

Я использую Selenium - Python, и я запускаю для l oop через древовидную структуру

Это выглядит так:

enter image description here

Идентификатор в файлах постоянно меняется, но в конечном итоге я хочу загрузить файлы.

Я пробовал что-то вроде этого:

for id in range(2, 41):
     my_id = "stree{}".format(id)
     browser.find_element_by_id(my_id).click()
     browser.execute_script("window.history.go(-1)")

Но для l oop обнаруживается STALEELEMENT в двух итерациях, потому что в конце кода я go возвращается.

Как мне это сделать?

1 Ответ

0 голосов
/ 28 марта 2020

Если это та же проблема, с которой я сталкивался дважды, то click () расширяет структуру, делая элементы ниже go устаревшими (я не знаю почему). Вы можете попробовать подход ниже.

Идея состоит в том, чтобы сначала открыть всю структуру в браузере, а затем повторить ее. В основном выполняется find_elements на каждой итерации после click (), чтобы обновлять список.

Псевдокод (это в ширину, но и в глубину работает тоже)

for each level:
   grab the whole list of elements using find_elements(...)
   for i in 0 to number of elements in the list
      grab the list again (yes the whole list)
      iterate to the ith element and click() it [if it's clickable]

Выполнение find_elements в каждой итерации l oop возвращает действительные видимые элементы, гарантирующие, что ни один из них не устарел. После того, как структура полностью открыта, ее можно безопасно перемещать.

Пример кода: (tree_items - это xpath элементов в объекте stree)

# save the names of the target level elements
elements = driver.find_elements_by_xpath(tree_items)
names = []
for elem in elements:
   names.append(elem.text)

# click elements in the target level (names)
for i in range(0, len(elements)):
   elements = driver.find_elements_by_xpath(tree_items)
   elem = elements[i]
   # only click the elements in the names list (this level)
   if elem.text in names:
      names.remove(elem.text)
      try:
         elem.click()
      except WebDriverException:
         pass # ignore if elem is not clickable

После того, как все дерево открыто, используйте ваш код find_element для получения имени файла для загрузки.

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