Как подтвердить текст всплывающей подсказки с помощью Selenium и Python unittest - PullRequest
0 голосов
/ 28 января 2019

Я учу Селен.Почему этот простой тест не проходит?

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.action_chains import ActionChains
import unittest


class ToolTipTest (unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("http://jqueryui.com/tooltip/")
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()

    def test_tool_tip(self):
        driver = self.driver
        frame_elm = driver.find_element_by_class_name("demo-frame")
        driver.switch_to.frame(frame_elm)
        age_field = driver.find_element_by_id("age")
        ActionChains(self.driver).move_to_element(age_field).perform()
        tool_tip_elm = WebDriverWait(self.driver, 10).until(
            expected_conditions.visibility_of_element_located(
            (By.CLASS_NAME, "ui-tooltip-content")))

        # verify tooltip message
        self.assertEqual(
            "We ask for your age only for statistical purposes.",
            tool_tip_elm.text)

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main(verbosity=2)

Иногда он дает

AssertionError: 'We ask for your age only for statistical purposes.' != "ThemeRoller: jQuery UI's theme builder app
lication"
- We ask for your age only for statistical purposes.
+ ThemeRoller: jQuery UI's theme builder application

Иногда:

AssertionError: 'We ask for your age only for statistical purposes.' != "That's what this widget is"
- We ask for your age only for statistical purposes.
+ That's what this widget is

Так что ошибка не всегда одинакова.Иногда это проходит.Похоже, что это выбрать случайное всплывающее окно. Вот страница для тестирования.Я использую python 3.6 selenium 3

Редактировать: также, как я могу проверить (в Firefox Developer Tools) HTML-код подсказок, чтобы посмотреть класс, идентификатор и т. Д.?Когда я выбираю код, всплывающая подсказка исчезает и код тоже ...

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы были почти там.Элемент с текстом подсказки был неправильным.Для подтверждения текста подсказки можно использовать следующее оптимизированное решение:

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    import unittest
    
    
    class ToolTipTest (unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.get("http://jqueryui.com/tooltip/")
            self.driver.implicitly_wait(30)
            self.driver.maximize_window()
    
        def test_tool_tip(self):
            driver = self.driver
            WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.demo-frame")))
            age_field = driver.find_element_by_css_selector("input#age")
            ActionChains(self.driver).move_to_element(age_field).perform()
            tool_tip_elm = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ui-helper-hidden-accessible div:not([style])")))
            self.assertEqual("We ask for your age only for statistical purposes.", tool_tip_elm.text)
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == "__main__":
        unittest.main(verbosity=2)
    
  • КонсольВыход:

    test_tool_tip (__main__.ToolTipTest) ... ok
    
    ----------------------------------------------------------------------
    Ran 1 test in 17.618s
    
    OK
    
0 голосов
/ 29 января 2019

Добавьте некоторое (другое динамическое) ожидание перед строкой

tool_tip_elm = ...

, потому что ваш код ждет, пока элемент не станет видимым, но всплывающий текст впоследствии изменяется.Таким образом, ваш тест часто быстрее, чем смена веб-страницы.

Рабочая версия (но со статическим ожиданием):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.action_chains import ActionChains
import unittest
import time

class ToolTipTest (unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("http://jqueryui.com/tooltip/")
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()

    def test_tool_tip(self):
        driver = self.driver
        frame_elm = driver.find_element_by_class_name("demo-frame")
        driver.switch_to.frame(frame_elm)
        age_field = driver.find_element_by_id("age")
        ActionChains(self.driver).move_to_element(age_field).perform()
        time.sleep(3)
        tool_tip_elm = WebDriverWait(self.driver, 10).until(
            expected_conditions.visibility_of_element_located(
            (By.CLASS_NAME, "ui-tooltip-content")))

        # verify tooltip message
        self.assertEqual(
            "We ask for your age only for statistical purposes.",
            tool_tip_elm.text)

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main(verbosity=2)

...