Как создать тест Selenium Webdriver для проверки отсутствия элемента? - PullRequest
4 голосов
/ 02 февраля 2012

Я создаю модульные тесты для моего приложения 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()    

Как это проверитьЭлемент страницы отсутствует?

Ответы [ 10 ]

4 голосов
/ 06 августа 2013
from selenium.common.exceptions import NoSuchElementException

with self.assertRaises(NoSuchElementException):
    self._driver.find_element_by_link_text("Topic to delete")
4 голосов
/ 03 февраля 2012

За исключением того, что это может не сработать, потому что если ничего не найдено,

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 голосов
/ 05 февраля 2012

Вы ловите неправильное исключение. Когда элемент не найден, он поднимает NoSuchElementException

self.assertRaises('selenium.common.exceptions.NoSuchElementException', self._driver.find_element_by_link_text("Topic to delete"))
1 голос
/ 16 августа 2013
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, безотносительно) и ничего там, это простовозвращает пустой список.

1 голос
/ 07 ноября 2012

В Java у меня работало:

try {
    assertNull(findElement(By.cssSelector("...")));
} catch (NoSuchElementException e) {
    // its OK, as we expect this element not to be present on the site
}
1 голос
/ 16 августа 2012

поскольку элемент удаляется с помощью вызова 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"))

Это заставит веб-драйвер ждать 10 секунд, пока элемент НЕ будет там. Вы можете увеличить время ожидания более 10 секунд, если хотите.

0 голосов
/ 18 октября 2015

Очень позднее добавление, потому что большая часть ответов уже здесь, кажется, для Java.Вопрос к питону.Многие из ответов Python синтаксически неверны.Правильная форма будет включать:

selenium.common.exceptions import NoSuchElementException 

# other code 

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

Эта последняя строка в основном является исходным кодом OPs, но переписана таким образом, чтобы гарантировать, что утверждение будет выполнено без исключения.

0 голосов
/ 13 мая 2015

Я думаю, что это можно определить для обнаружения видимого элемента, только для 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 голосов
/ 13 ноября 2014

Ваш код выглядит так, как будто это 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 голосов
/ 02 февраля 2012

В Java вы будете делать:

assertNotNull(driver.findElement(By.css("<css selector>")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...