我正在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()
如何测试页面元素是否缺失?
答案 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)
答案 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原始代码,但是以确保断言执行而不抛出异常的方式重写。