Если это та же проблема, с которой я сталкивался дважды, то 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 для получения имени файла для загрузки.