Python 如何创建SeleniumWebDriver测试以验证元素不存在?

Python 如何创建SeleniumWebDriver测试以验证元素不存在?,python,django,unit-testing,selenium,webdriver,Python,Django,Unit Testing,Selenium,Webdriver,我正在SeleniumWebDriver中为我的Django应用程序创建单元测试 我有一个从数据库中删除主题的AJAX方法。 我试图找出如何验证已删除的主题不再出现在页面上 我正在尝试捕获Webdriver找不到元素时应生成的异常: selenium.common.exceptions.NoSuchAttributeException 相反,我看到了一个错误: *** URLError: <urlopen error timed out> 如何测试页面中是否缺少某个元素 在Java

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

我有一个从数据库中删除主题的AJAX方法。 我试图找出如何验证已删除的主题不再出现在页面上

我正在尝试捕获Webdriver找不到元素时应生成的异常: selenium.common.exceptions.NoSuchAttributeException

相反,我看到了一个错误:

*** URLError: <urlopen error timed out>
如何测试页面中是否缺少某个元素

在Java中,您将执行以下操作:

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

但这可能不起作用,因为如果什么也找不到

driver.findElement(By.css("<css selector>")) 
或者反过来

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

)

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

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

由于该元素正在被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秒以上

在Java中,对我有用的是:

try {
    assertNull(findElement(By.cssSelector("...")));
} catch (NoSuchElementException e) {
    // its OK, as we expect this element not to be present on the site
}
或者你也可以这么做

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

这是因为如果您通过_XXXX(带有S和XXXX=名称、标记名、xpath、watever的元素)找到了_elementssu,但什么都没有,它只会返回一个空列表。

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

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

添加得很晚,因为这里已经给出的很多答案似乎都是针对java的。问题是python。python的许多答案在语法上是不正确的。正确的形式包括:

selenium.common.exceptions import NoSuchElementException 

# other code 

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

最后一行基本上是OPs的原始代码,但重新编写时要确保在不引发异常的情况下执行断言。

我得到的唯一异常是:URLRERROR:这是java代码,而问题是python和Django,这是java代码,而问题是python和Django,你可能是意思是语义而不是语法,因为每个答案的语法都很好。
if not len(element_you_are_looking_for):
    print("Element Not present!")
    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")
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)
selenium.common.exceptions import NoSuchElementException 

# other code 

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