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

Как перемещаться по вкладкам при помощи python и seleniumWD?

nosetests
webdriver
selenium
python
Теги: #<Tag:0x00007fedbfdfe558> #<Tag:0x00007fedbfdfe3c8> #<Tag:0x00007fedbfdfe1c0> #<Tag:0x00007fedbfdfde78>

(Gukobrist) #41

Я что-то не пойму тут. Что значит вот это?

wait.until(ec.new_window_is_opened(old_windows))

или это

wait.until(ec.number_of_windows_to_be(3)) # 2,1 etc.

Я сделал как вы написали. Но буквально на 5 шаге, где мне надо кликнуть по картинке, мой тест падает. Страница с картинкой после логина просто не успевает загрузиться.

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div/*/img"}

Вот пример кода моего теста.

        driver = self.driver
        wait = WebDriverWait(driver, 10)  # ожидание
        driver.get(hostname)
        window_before = driver.window_handles[0]
        wait
        driver.find_element(By.XPATH, "//div/input[@name='username']").send_keys(username)
        wait
        driver.find_element(By.XPATH, "//div/input[@name='password']").send_keys(password)
        wait
        driver.find_element(By.XPATH, "//div/input[@name='code']").send_keys(code)
        wait
        driver.find_element(By.XPATH, "//em/button[@type='button']").click()
        wait
        driver.find_element(By.XPATH, "//div/*/img").click()
        wait
        driver.find_element(By.XPATH, "//div/div[contains(text(), 'Оператор')]").click()
        wait

(Gukobrist) #42

Кажется я нашел где почитать. Извините, что отвлек. https://habrahabr.ru/post/273089/


(rmerkushin) #43

Вы не правильно вейт юзаете. Смотрите доки. http://selenium-python.readthedocs.io/waits.html#explicit-waits


(Gukobrist) #44

Хехе. Я попробовал сделать по инструкции и немного запутался. может вы сможете помочь.

driver = self.driver
        wait = WebDriverWait(driver, 10)
        driver.get(hostname)
        window_before = driver.window_handles[0]
        wait.until(lambda driver: driver.find_element(By.XPATH, "//div/input[@name='username']").send_keys(username)) #измененный вариант по документации
    
        driver.find_element(By.XPATH, "//div/input[@name='password']").send_keys(password)

Во время прохождения теста, он не переходит ко второму шагу - ввода пароля, а застревает на первом и 10 секунд вводит логин в поле логин.

Что я делаю не так?


(Gukobrist) #45

В итоге сделал вот так

        driver = self.driver
        wait = WebDriverWait(driver, 10)
        driver.get(hostname)
        window_before = driver.window_handles[0]
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div/input[@name='username']")))
        element.send_keys(username)
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div/input[@name='password']")))
        element.send_keys(password)
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div/input[@name='code']")))
        element.send_keys(code)
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//em/button[@type='button']")))
        element.click()
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div/*/img")))
        element.click()
        element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div/div[contains(text(), 'Оператор')]")))
        element.click()

И тест падает на том же самом месте когда надо кликнуть по картинке, со слипами такого не происходит.


(rmerkushin) #46

У вас там ajax случаем нет? Ну и увас слишком много вейтов. Выберите что-то одно, что дольше всех грузится. После него и начинайте искать элементы. С каким эксепшеном падает тест?


(Gukobrist) #47

Это extjs. Сначала появляется форма входа - я ввожу логин, пароль и т.д. Затем грузится страница после логина и там мне в главном меню надо перейти на другую страницу. Главное меню это раскрывающийся список. Я его открываю при помощи нажатия на “стрелочку вниз” - по xpath это обычная картинка (By.XPATH, “//div/*/img”). Если я ставлю sleep и затем кликаю по картинке, то все норм и все открывается. А в предыдущей реализации он мне пишет

Message: unknown error: Element <img src="extjs3.3/resources/images/default/s.gif"> is not clickable at point (319, 20)

Почему получается, что при sleep я жду когда страница откроется после логина и он нормально кликает, а при waits он мне пишет, что элемент не кликабельный.


(rmerkushin) #48

Вам нужно дожидаться завершения ajax’а. Как это сделать с extjs, я вам не подскажу. Для jQuery делается как-то так:

@staticmethod
    def wait_for_ajax(_type, _locator, timeout=5):
        message = "Element '%s' was not visible in %s second(s)." % (_locator, str(timeout))
        driver = SeleniumWrapper().driver
        wait = WebDriverWait(driver, timeout)
        wait.until(EC.element_to_be_clickable(_type, _locator)
                   and driver.execute_script("return $.active") == 0, message=message)

(Gukobrist) #49

Уу-у-у это уже уровень. Посижу подумаю. А пока буду использовать sleep.


(rmerkushin) #50

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


(Gukobrist) #51

)) А где можно посмотреть какой элемент грузится позже всего на странице?


(rmerkushin) #52

Глазами или через инструменты разработчика )


(Gukobrist) #53

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


(rmerkushin) #54

Я же говорю, либо на глаз, либо откройте инструменты разработчика и смотрите на вкладке Network какие запросы куда идут и в какой последовательности. Еще лучше спросить у разработчиков, они смогут подсказать более точно.


(Frozen Sun) #55

А почему никто не пользует https://pypi.python.org/pypi/PyAutoGUI ?
Крутая библа же, проста как 3 копейки. Эмуляция набора с клавиатуры и действия мыши. Реализовываю работу с всплывающими окнами


(Gukobrist) #56

Прикольно, а вы сами используете? Можете показать какой-нибудь пример? Кусок кода?


(Tatyana Durova) #57

Помогите что делать если в моем случае Как отрыть новую вкладку с определенным url в фоном режиме (приложение самое ничего не открывает) пожалуйста!