如何创建Selenium Webdriver测试以验证元素不存在?

时间:2012-02-01 21:47:46

标签: python django unit-testing selenium webdriver

我正在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()    

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

10 个答案:

答案 0 :(得分:4)

除非可能无效,因为如果找不到任何内容,

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

答案 1 :(得分:4)

from selenium.common.exceptions import NoSuchElementException

with self.assertRaises(NoSuchElementException):
    self._driver.find_element_by_link_text("Topic to delete")

答案 2 :(得分:3)

您正在捕获不正确的异常。如果找不到元素,则会引发NoSuchElementException

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

答案 3 :(得分:1)

因为要通过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秒以上。

答案 4 :(得分:1)

在Java中,对我有用的是:

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

答案 5 :(得分:1)

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!")

这是有效的,因为如果你find_elementSSSSSSSSS_by_XXXX(带有S的元素,xxxx = name,tagname,xpath,watever)并且没有任何东西,它只返回一个空列表。

答案 6 :(得分:0)

在Java中你会这样做:

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

答案 7 :(得分:0)

您的代码看起来可能是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),您可以使用相同的方法,但将链接文本的名称替换为您页面上元素的位置。

答案 8 :(得分:0)

我认为这个可以定义为检测可见元素,仅适用于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)

答案 9 :(得分:0)

很晚才添加,因为这里的答案似乎都是针对java的。问题是python。许多python答案在语法上都是不正确的。正确的形式将涉及:

selenium.common.exceptions import NoSuchElementException 

# other code 

self.assertRaises(NoSuchElementException, self._driver.find_element_by_link_text, 
 "Topic to delete")

这最后一行基本上是OP原始代码,但是以确保断言执行而不抛出异常的方式重写。