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

Нажать последовательно на элементы выпадающего списка

python
selenium
webdriver
Теги: #<Tag:0x00007f7b64aeadd0> #<Tag:0x00007f7b64aeac90> #<Tag:0x00007f7b64aeab50>

(Наталия Гвоздик) #1

Есть поиск по имени, при вводе первых символов появляется выпадающий список. Нужно последовательно нажимать на каждый пункт списка.

    driver.find_element_by_css_selector("body > div.header > div.container > div.row.first_line > div.col-480-4.col-xs-3.col-sm-3.col-md-3.col-lg-3.lh_normal > a > div").click()
    driver.find_element_by_link_text(u"Поиск по имени").click()
    driver.find_element_by_name("name").clear()
    driver.find_element_by_name("name").send_keys(u"А")
    if "autocomplete-suggestions" in driver.page_source:
        print "yes"
        kol = driver.find_elements_by_class_name("autocomplete-suggestion")
        print len(kol)
        print kol
        l = len(kol)
        for i in range(0, l, 1):
            driver.find_elements_by_css_selector("body > div.autocomplete-suggestions.autocomplete_input_name_dropdown").click()
            time.sleep(1)
            driver.find_element_by_css_selector("#find_name > button.tab_button").click()
            time.sleep(1)
            assert "" in driver.page_source
            driver.find_element_by_css_selector("body > div.header > div.container > div.row.first_line > div.col-480-4.col-xs-3.col-sm-3.col-md-3.col-lg-3.lh_normal > a > div").click()
            driver.find_element_by_link_text(u"Поиск по имени").click()
            driver.find_element_by_name("name").clear()
            driver.find_element_by_name("name").send_keys(u"А")

Я сделала так. Цикл проходит правильное кол-во раз, но как сделать, что бы при каждой иттерации выбирался следующий пункт списка понять не могу(
Еще необходимо, что бы в assert при каждом проходе цикла подставлялось новое значение. Тоесть, если выбран первый пункт списка - Мария Петрова, 2 - Мария Иванова и т.д.
Помогите, пожалуйста


(Goshko Nazar) #2

Вас за такое сожгут

дважды причем
0. Находит тег фрейма фильтра (я так понял у вас выпадающий фильтр по введенной букве)
2. ЖДЕМ (is visible) и находим лист с елементами, при чем берем или полностью лист, или по относительной ссылке на каждый элемент лист елементов ссылок(не текста)
3. ЖДЕМ (is clickable) и жмакаем на элемент, и возвращаем его текст ели нужно.
Так как Вам нужно хранить репрезентативное состояние, можно брать генератор активных ссылок, а из него уже какое то количество ссылок.
4. Итерацию по списку/генератору проводить уже в цикле. Так как сам фрейм никуда не денется, поиск листа остается таким же, можно или вынести в функцию, или описать анонимной lambda
Теперь поговорим как сохранить Вас от огня. В стандарт ибилиотеки selenium python есть замечательные классы/функции работы с NativeAction, ожиданиями и критериями поиска. Организованы они хорошо, посему изучите документацию и используйте их.
Пример:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

el_text = WebDriverWait(self.driver, 5).until(ec.text_to_be_present_in_element((By.CSS_SELECTOR, '#wrapper > h1'), 'My Courses'))`

Как не обжечся дважды:
Хорошим тоном есть ВЫНОС асертов из функций, предоставляющих функционал приложения - отделяем мух от котлет.

О чем забыл упомянуть: Часто на элемент нельзя счелкнуть так как он не является “счелкающим”. Такое бывает от верстки, когда например элемент свернут в div > p > a, а вы счелкаете по div, в такой случае нужно уходить глубже до самой ссылки.


(Наталия Гвоздик) #3

Спасибо за ответ. Скажите, а где можно почитать, как писать тесты, что бы меня за них не сожгли?