Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

выполнить click по всем елементам в списке python

selenium
python
webdriver
Теги: #<Tag:0x00007fedbb2578e8> #<Tag:0x00007fedbb257730> #<Tag:0x00007fedbb2575a0>

(Sergey Gerasimuk) #1

Есть метод, который возвращает набор елементов меню.
def get_menu_elements(self):
manu_elements = self.browser.find_elements(**self.global_locators[‘menu_elements’])
return manu_elements
Я хочу пройтись по этому списку и выполнить click() по каждому.
for link in menu_links:
link.click()
Но тут возникает проблема - при клике на первом элементе остальные перестают существовать, так как страница перезагружается и в итоге вылетает ошибка
stale element reference: element is not attached to the page document

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

Если кто придумает решение - буду очень признателен


(Максим Неверный) #2

А почему бы просто не использовать конструкцию типа:
element.click() wait.until(EC.element_to_be_clickable...
? И тогда уже просто циклически кликать по элементам, ожидая пока они отрисутются?

    while driver.find_elements_by_id("id"):
            driver.find_element_by_id('id').click()
            wait.until(EC.element_to_be_clickable((By.ID, "id")))
    else:
        print('всё!')

(Ильдар Бекмансуров) #3
   menu_elements = get_menu_elements()
   number_of_elements = len(menu_elements)
   for i in range(number_of_elements):
       menu_elements = get_menu_elements()
       link = menu_elements[i]
       link.click()

Иными словами:
Сначала считаем сколько элементов меню получилось len(menu_elements).
Потом в цикле обновляем список menu_elements, т.к. старые перестают существовать и кликаем по i-му элементу меню.


(Yaroslav Pernerovskyy) #4

Никак. Если ловите stale element reference, то надо вычитывать элемент перед каждым новым кликом.


(Sergey Gerasimuk) #5

Да, я так примерно и реализовал:

menu = main_category.get_menu_elements()
for x in range(1,len(menu)+1):
main_category.get_menu_elements(x).click()

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


(Sergey Gerasimuk) #6

Ну оно то можно сохранить какие то атрибуты элементов в массив, и потом по этому массиву пройтись, в принципе, работать будет.
тут вот типа такого костыля придумали:


(Yaroslav Pernerovskyy) #7

Ну это то, что я и сказал, делаем поиск элемента непосредственно перед использованием. И это не костыль )