2013-07-01 3 views
5

Я пытаюсь проверить, что текст присутствует на странице. Проверка элемента на ID достаточно проста, купив попытку сделать это, текст не работает правильно. И я не могу найти правильный атрибут для К для проверки текста на веб-странице.Проверка наличия элемента с помощью 'By' от Selenium Webdriver и Python

Пример, который работает для ID с помощью По атрибуте

self.assertTrue(self.is_element_present(By.ID, "FOO")) 

примера я пытаюсь использовать (не работает) для текста с помощью По атрибута

self.assertTrue(self.is_element_present(By.TEXT, "BAR")) 

Я попробовали их также с * погрешностью (ниже)

self.assertTrue(self.is_text_present("FOO")) 

и

self.assertTrue(self.driver.is_text_present("FOO")) 

* Ошибка: AttributeError: объект 'WebDriver' не имеет атрибута 'is_element_present'

У меня есть один и тот же вопрос при попытке проверки By.Image, а также.

+0

, который импортируется 'от импорта selenium.webdriver.common.by By' – Dave

+0

вы видите' By.ID'? – Dave

+0

Я вижу 'Идентификатор'' ID' 'имя'' xpath'' dom' 'sizzle_selector'' link_text' 'css_selector'' tag_name' 'defaults' и' key_attributes' – Dave

ответ

2

Прежде всего, это обескураживает это, лучше изменить логику тестирования, чем найти текст на странице.

Вот как создать собственный is_text_present метод, хотя, если вы действительно хотите использовать его:

def is_text_present(self, text): 
    try: 
     body = self.driver.find_element_by_tag_name("body") # find body tag element 
    except NoSuchElementException, e: 
     return False 
    return text in body.text # check if the text is in body's text 

Для изображений, логика вы передаете локатор в него. (Я не думаю, что is_element_present существует в WebDriver API, хотя, не знаю, как вы получили By.ID работу, давайте предположим, что это работает.)

self.assertTrue(self.is_element_present(By.ID, "the id of your image")) 
# alternatively, there are others like CSS_SELECTOR, XPATH, etc. 
# self.assertTrue(self.is_element_present(By.CSS_SELECTOR, "the css selector of your image")) 
+0

Ты уже мертв. Мой чек не прошел. – Dave

5

Из того, что я видел, is_element_present порождается расширением Firefox (Selenium IDE) и выглядит следующим образом:

def is_element_present(self, how, what): 
    try: self.driver.find_element(by=how, value=what) 
    except NoSuchElementException: return False 
    return True 

"By" импортируется из selenium.webdriver.common:

from selenium.webdriver.common.by import By 
from selenium.common.exceptions import NoSuchElementException 

Есть несколько "К" констант для решения каждого API find_element_by_ * так, например:

self.assertTrue(self.is_element_present(By.LINK_TEXT, "My link")) 

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

+0

Это один :) – Axel

0

Мне нравится упаковка все это в настраиваемой утверждение

from selenium.common.exceptions import NoSuchElementException 

def assertElementIsPresentByXPath(self, xpath, msg=None): 
    try: 
     self.browser.find_element_by_xpath(xpath) 
     self.assertTrue(True, msg) 
    except NoSuchElementException: 
     self.assertTrue(False, msg) 

def test_element_10_should_exists(self): 
    self.browser.get('url/to/test') 
    self.assertElementIsPresentByXPath('//a[@id=el_10]') 
Смежные вопросы