2012-02-01 98 views
4

我在Selenium Webdriver中爲我的Django應用程序創建單元測試。如何創建一個Selenium Webdriver測試來驗證元素不存在?

我有一個從數據庫中刪除一個主題的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

在Java中,你會做的事:因爲如果沒有找到

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

這是Java代碼,而問題是Python和Django的 – e4c5 2015-10-18 11:19:53

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

3

你抓不正確的異常。當元素沒有找到它提出了NoSuchElementException

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

我得到的唯一的例外是:URLError:<錯誤的urlopen超時> – BryanWheelock 2012-02-06 18:44:21

1

由於元件是由AJAX調用刪除,我會檢查它像這樣:

這將使的webdriver等待10秒鐘,直到元素不在那裏。如果您願意,您可以將超時時間延長至10秒以上。

1

在Java什麼工作對我來說是:

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

這是Java代碼,而問題是Python和Django的 – e4c5 2015-10-18 11:19:20

4
from selenium.common.exceptions import NoSuchElementException 

with self.assertRaises(NoSuchElementException): 
    self._driver.find_element_by_link_text("Topic to delete") 
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)並且沒有任何內容,它只是返回一個空列表。

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),你可以用同樣的方法,但替換與鏈接文本的名稱元素在你頁面上的位置。

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) 
0

很晚此外,由於大部分的答案已經在這裏似乎是爲Java。問題是python。許多python答案在語法上不正確。正確的形式將包括:

selenium.common.exceptions import NoSuchElementException 

# other code 

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

最後一行基本上是有機磷農藥原代碼,但重新編寫以這樣的方式,以確保斷言將未拋出異常執行。

+0

你大概就是這個意思語義而不是語法,因爲在每個答案中語法都很好。 – 2015-10-18 11:33:34

相關問題