【问题标题】:How do I create a Selenium Webdriver test to verify an element is not present?如何创建 Selenium Webdriver 测试以验证元素不存在?
【发布时间】:2012-02-24 14:32:57
【问题描述】:

我正在 Selenium Webdriver 中为我的 Django 应用程序创建单元测试。

我有一个从数据库中删除主题的 AJAX 方法。 我正在尝试弄清楚如何验证页面上不再存在已删除的主题。

我试图捕捉当 Webdriver 找不到元素时应该生成的异常: selenium.common.exceptions.NoSuchAttributeException

相反,我看到一个错误:

*** URLError: <urlopen error timed out>

这是我设置测试的方式:

from selenium import webdriver
from django.utils import unittest  

class TestAuthentication(unittest.TestCase):    
    scheme = 'http'    
    host = 'localhost'    
    port = '4444'    


    def setUp(self):    
        self._driver = webdriver.Firefox()    
        self._driver.implicitly_wait(10)    

    def login_as_Kallie(self):    
        # Kallie has manual login    
        self._driver.get('http://localhost:8000/account/signin/')    
        user = self._driver.find_element_by_id('id_username')    
        user.send_keys("Kallie")    
        password = self._driver.find_element_by_id('id_password')    
        password.send_keys('*********')    
        submit = self._driver.find_element_by_id('blogin')    
        submit.click()    

    def test_Kallie_can_delete_topic(self):    
        self.login_as_Kallie()    
        self._driver.find_element_by_link_text("Topic to delete").click()    
        self._driver.find_element_by_xpath("/html/body/div/div[4]/div/div/div[2]/div/table/tbody/tr/td[2]/div/div[3]/span[5]/a").click()    
        self._driver.find_element_by_class_name('dialog-yes').click()    
        self._driver.get("http://localhost:8000/questions/")    
        # this is the Python exception to catch: selenium.common.exceptions.NoSuchAttributeException    
        self.assertRaises('selenium.common.exceptions.NoSuchAttributeException', self._driver.find_element_by_link_text("Topic to delete"))    

    def tearDown(self):    
        self._driver.quit()    

如何测试页面元素是否缺失?

【问题讨论】:

    标签: python django unit-testing selenium webdriver


    【解决方案1】:
    from selenium.common.exceptions import NoSuchElementException
    
    with self.assertRaises(NoSuchElementException):
        self._driver.find_element_by_link_text("Topic to delete")
    

    【讨论】:

      【解决方案2】:

      除非那可能行不通,因为如果什么也没找到,

      driver.findElement(By.css("<css selector>")) 
      

      将返回一个 NoSuchElementException,它可能与您看到的异常的 Java 等价物。

      不确定 Python,但在 Java 中会更好

      assertTrue(driver.findElements(By.whateverYouWant).size() == 0) 
      

      或者反过来

      assertFalse(driver.findElements(By.whateverYouWant).size() > 0)
      

      http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.html#findElement(org.openqa.selenium.By)

      【讨论】:

        【解决方案3】:

        您正在捕获不正确的异常。当找不到元素时,它会引发NoSuchElementException

        self.assertRaises('selenium.common.exceptions.NoSuchElementException', self._driver.find_element_by_link_text("Topic to delete"))
        

        【讨论】:

        • 我得到的唯一异常是: URLError:
        【解决方案4】:

        由于 AJAX 调用正在删除该元素,我会像这样检查它:

        from selenium.webdriver.support.ui import WebDriverWait
        
        w = WebDriverWait(driver, 10)
        w.until_not(lambda x: x.find_element_by_link_text("Topic to delete"))
        

        这将使 webdriver 等待 10 秒,直到元素不存在。如果您愿意,可以将超时时间增加到 10 秒以上。

        【讨论】:

          【解决方案5】:

          在 Java 中对我有用的是:

          try {
              assertNull(findElement(By.cssSelector("...")));
          } catch (NoSuchElementException e) {
              // its OK, as we expect this element not to be present on the site
          }
          

          【讨论】:

          • 这是java代码,而问题是针对python和django的
          【解决方案6】:
          element_you_are_looking_for = driver.find_elements_by_name("elements name")
          #notice how it says "ELEMENTSSSSSSSSSSSSSSSSS"
          if len(element_you_are_looking_for):
              print("element is present")
          elif:
              print("element is not present")
          

          或者你可以这样做

          if not len(element_you_are_looking_for):
              print("Element Not present!")
          

          这是可行的,因为如果您找到_elementSSSSSSSSS_by_XXXX(带有 S 的元素,并且 xxxx = name,tagname,xpath,watever)并且什么都没有,它只会返回一个空列表。

          【讨论】:

            【解决方案7】:

            在 Java 中你会这样做:

            assertNotNull(driver.findElement(By.css("<css selector>")));
            

            【讨论】:

            • 这是java代码,而问题是针对python和django的
            【解决方案8】:

            您的代码看起来可能是 Python。由于您的主题似乎属于 LINK_TEXT 类型,因此应该可以使用以下方法:

                for i in range(60):
                    try:
                        if not self.is_element_present(By.LINK_TEXT, "Topic to delete"): break
                    except: pass
                    time.sleep(1)
                else: self.fail("time out")
            

            如果它是另一种类型(即 XPATH),您可以使用相同的方法,但将链接文本的名称替换为您页面上元素的位置。

            【讨论】:

              【解决方案9】:

              我认为这个可以定义为检测可见元素,仅用于 django

              from selenium.webdriver.chrome.webdriver import WebDriver
              from django.test import LiveServerTestCase
              
              class MyLiveServerTestCase(LiveServerTestCase):
              
                  def test_element_not_displayed(self):
                      self.selenium.get('http://your_url.com')
                      displayed = self.selenium.find_element_by_tag_name('table').is_displayed()
              
                      self.assertFalse(displayed)
              

              【讨论】:

                【解决方案10】:

                添加非常晚,因为这里的大部分答案似乎都是针对 java 的。问题是针对python的。许多 python 答案在语法上是不正确的。正确的形式包括:

                selenium.common.exceptions import NoSuchElementException 
                
                # other code 
                
                self.assertRaises(NoSuchElementException, self._driver.find_element_by_link_text, 
                 "Topic to delete")
                

                最后一行基本上是 OP 的原始代码,但以这样一种方式重新编写,以确保断言将在不引发异常的情况下执行。

                【讨论】:

                • 您可能指的是语义而不是语法,因为每个答案的语法都很好。
                猜你喜欢
                • 2015-05-29
                • 2015-08-14
                • 2012-07-21
                • 1970-01-01
                • 2011-12-20
                • 1970-01-01
                • 2014-01-05
                • 2013-07-18
                • 1970-01-01
                相关资源
                最近更新 更多