代码之家  ›  专栏  ›  技术社区  ›  fabio

如何通过Selenium和Python UnitTest断言工具提示文本

  •  1
  • fabio  · 技术社区  · 6 年前

    我在学硒。为什么这个简单的测试失败了?

    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
    

    所以错误并不总是相同的。有时候会过去。看起来它选择了一个随机弹出窗口。 Here's 要测试的页面。我使用的是python 3.6 Selenium 3

    编辑:我如何检查(在火狐开发工具中)工具提示的HTML代码,以查看类、ID等?当我选择代码时,工具提示会显示,代码也会显示…

    2 回复  |  直到 6 年前
        1
  •  1
  •   undetected Selenium    6 年前

    你就快到了。元素 工具提示文本 不是正确的。断言 工具提示文本 您可以使用以下优化解决方案:

    • 代码块:

      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
      
        2
  •  1
  •   mmichalik    6 年前

    添加一些(其他动态)行前等待

    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)