Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Почему не работает presence_of_element_located

python
webdriver
Теги: #<Tag:0x00007f7b6d1c8410> #<Tag:0x00007f7b6d1c8280>

(Дмитрий Золкин) #1

Не могу понять почему не работает мой тест без sleep
написал такой вот метод для работы с таблицей

`    def get_text_from_table(self,locator):
        try:
            WebDriverWait(self.driver,10).until(
                EC.presence_of_all_element_located(locator)
            )
            list_of_text = []
            list_of_elements = self.driver.find_elements_by_tag_name("td")
            for cell in list_of_elements:
                list_of_text.append(cell.text)
            return list_of_text
        except:
            pass

в тесте вызываю assertEqual(main_page.get_text_from_table,“Список с которым сравниваю”)
Перед методом приходиться ставить sleep как я понимаю таблица не успевает появится и тест говорит, что пустой список не равен списку.
Почему не работает строка EC.presence_of_all_elements_located(locator) она же должна ждать пока не появится элемент в DOM(или я не правильно понимаю???). В качестве локатора передаю ячейку из таблицы, которая должна появится.
Так не работает

    def test__26_check_reference_added(self):
        main_page = MainPage(driver)
        self.assertEqual(main_page.get_text_from_table(Locators_19_10.TABLE_1_3),test_data_reference_19_10_1_3)

Так работает

    def test__26_check_reference_added(self):
        main_page = MainPage(driver)
        sleep(2)
        self.assertEqual(main_page.get_text_from_table(Locators_19_10.TABLE_1_3),test_data_reference_19_10_1_3)

Подскажите, что я делаю не так ???


(Виталий Коряков) #2

А вы прописываете в сетапе implicitlywait?


(Дмитрий Золкин) #3

нет. Как я понимаю либо EC либо implicity.


(Goshko Nazar) #4

Да потому что вы ждете (как я понял), корень таблицы, а ячейки - нет, вот и выходит table появилась а я чейки нет, вот вам и пустой список.
Второе. юзайте таки visible, на таблицу, а на ячейки located (в принципе если контейнер div хватит и первого)


(Дмитрий Золкин) #5
def get_text_from_table(self,locator,text):
    try:
        WebDriverWait(self.driver,10).until(
            EC.text_to_be_present_in_element(locator, text)
        )
        list_of_text = []
        list_of_elements = self.driver.find_elements_by_tag_name("td")
        for cell in list_of_elements:
            list_of_text.append(cell.text)
        return list_of_text
    except:
        pass

Вот так почему то работает, но мне не нравится второй аргумент не знаю почему и сам метод тоже не нравится EC.text_to_be_present_in_element(locator, text)


(Дмитрий Золкин) #6

Нет я жду появления именно ячейку таблицы.


(Bolatbek) #7

Число “10” - это 10 миллисекунд.
Может в этом проблема?
Если нужно 10 секунд, надо писать 10000


(Дмитрий Золкин) #8

Нет число 10 это секунды…Из документации :

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
)

This waits up to 10 seconds before throwing a TimeoutException or if it finds the element will return it in 0 - 10 seconds


(Bolatbek) #9

Сорри, я уже месяц пишу на JS, привык к миллисекундам ).


(Дмитрий Мирошник) #10

В питоне не силён, но, исходя из логики селениума, вижу следующие варианты:
1). Presense != Clickable. То есть, элемент уже может быть в DOM, но доступиться ты до него не можешь.
2). Я так понимаю, presense ты определяешь для div, несущего таблицу. При этом совсем не факт, что таблица уже отрисовалась.
3). Исходя из 1 и 2, я бы заменил EC.presence_of_all_element_located(locator) на EC.elementToBeClickable() и локатор бы изменил на td, а не на несущий div.


(Дмитрий Золкин) #11

Ну я с трудом понял логику почему clickable. Для мне это можно применить к кнопке(например) ,но не как ни к ячейке к таблице , а я в локатор передаю именно ячейку таблицы(То есть я жду пока таблица прорисуется). Div я вообще не трогаю.
Я не понимаю почему второй мой вариант кода с текстом нормально проходит.
Чем метод presence_of_element_located хуже)) так скажем, чем text_to_be_present_in_element

Как не странно заработало с element_to_clickable, но логика мне осталась непонятна почему не работает presence_of_element_located…


(Дмитрий Мирошник) #12

Ну я с трудом понял логику почему clickable.

Потому что clickable = present & visible :slight_smile:
Если ячейку таблицы - тогда OK с пунктом 2. Переправь на clickable и должно наступить всеобщее счастье и коммунизЬм :wink:
По сути, вариант с текстом - это тот же аналог clickable.
Посмотри здесь:


(Goshko Nazar) #13

то есть типа есть елемент висибл, то он может бы не пресент? как то это все странно)