Не удается совершить клик на элемент в "тултипе"

python
webdriver
Теги: #<Tag:0x00007fedbb966e18> #<Tag:0x00007fedbb966c60>

(Igor) #1

Добрый день!
По своему желанию осваиваю автоматизацию тестирования. Тестирую проект, на котором столкнулся с проблемой. Возможно ее решение где-то уже всплывало на форуме. Не серчайте сильно.
Суть проблемы. Я хочу совершить переход в личный кабинет, но не получается совершить клик и выбор пункта “View Profile”.
Селектом выбрать не получается. По виду выпадающий список напоминает тултип.


Подскажите как верно будет выбрать “View Profile”?


(Maxim Zaitsev) #2

Решение зависит от конкретной ситуации.

  1. Использовать ожидание.
    http://selenium-python.readthedocs.io/waits.html
    1.1. Кликаем на иконку с пользователем
    1.2 Ожидаем появления окна с “подсказкой”
    1.3 Кликаем на профиль

  2. Использовать сложные действия в браузере (если совсем никак по другому!)
    http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

Пробуем последовательно варианты. Будут вопросы - код тестов и stacktrace ошибок обязательно.


(Bolatbek) #3

Ждете появления нужного элемента (саму ссылку) и жмакаете на него.


(Igor) #4

мм… спасибо. попробую


(Igor) #5

Добрый день!
Проблему не получилось решить. Такое впечатление, что даже первый клик на иконку с пользователем не происходит.
Ниже код теста и stacktrace

from selenium import webdriver
import unittest, os
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

class Test1(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.set_window_size(1920, 1080)
        self.driver.implicitly_wait(30)
        self.base_url = "https://test.com/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_1(self):
        #Open page and authorization
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_xpath("//a[@href='http://app.test.com/login']").click()
        driver.find_element_by_xpath("//input[@name='login']").clear()
        driver.find_element_by_xpath("//input[@name='login']").send_keys("test@test.ru")
        driver.find_element_by_xpath("//input[@name='password']").clear()
        driver.find_element_by_xpath("//input[@name='password']").send_keys("123456")
        driver.find_element_by_xpath("//button[@type='submit']").click()

        #Find element in tooltip and click
        driver.find_element_by_css_selector("p.name").click()
        wait = WebDriverWait(driver, 10)
        profile = wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, 'View Profile')))
        profile.click()

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)


if __name__ == "__main__":
    unittest.main()
======================================================================
ERROR: test_1 (__main__.Test1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Test/LK/test1.py", line 32, in test_1
    profile = wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, 'View Profile')))
  File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

----------------------------------------------------------------------
Ran 1 test in 41.446s

FAILED (errors=1)

Буду благодарен за помощь


(Maxim Zaitsev) #6

Ну так может, это и проверить в режиме дебаггера (по шагам)? Скорее всего клик-то проходит, только не потому элементу, которому нужно. Нужно проверить селектор

 driver.find_element_by_css_selector("p.name").click()

Возможно, он не уникальный на странице.


(Bolatbek) #7

После клика на “p.name” поставь большой слип на 20 секунд.
И смотри визуально - появился ли “View profile”.
Самый легкий способ “дебаггинга”)))
Ну или прикрутить создание скриншотов после фейла. И смотреть скрины.


(Maxim Zaitsev) #8

xD Нехай нормально учитцо дебажить.


(Igor) #9

“p.name” является уникальным селектором.
обращался к этому элементу и по xpath “/html/body/header/div[1]/div/div[2]/p”
клика не происходит


по шагам в дебаггере и с time.sleep(20) визуально не видно, чтобы происходил клик.


(Maxim Zaitsev) #10

Тогда тупик… Может кто еще подскажет умные мысли?


(Oleksandr Khotemskyi) #11

Попробуйте кликать не на
p.name
а на
div.header__userboard.js-userboard
возможно обработчик висит именно на нем.


(Igor) #13

кликаю на шаг выше

driver.find_element_by_xpath("/html/body/header/div[1]/div/div[2]").click()

также никакой реакции


(Bolatbek) #14

Пробуй еще, ищи, пока не кликнется и откроется тултип)))


(Maxim Zaitsev) #15

Запиши через Selenium IDE и посмотри какой локатор выбирается xD


(Igor) #16

:slightly_smiling_face:
думаешь не пробовал уже?)
p.name выбирается и затем //a[contains(@href, ‘/profile’)]
при переходе в профиль сыпется тест в ide


(Maxim Zaitsev) #17

беда (


(Bolatbek) #18

А там действительно надо кликать? Может достаточно подвести курсор?
Попробуй actions.


(Igor) #19

да, там нужно кликать.


(Bolatbek) #20

Прямо любопытно стало.
Может по тимвьюверу покажешь?


(Igor) #21

увы. проект закрытый и пока не имею права распространять на него ссылки / демонстрировать.
но все равно спасибо за советы.