2013-07-01 7 views
5

Próbuję sprawdzić, czy tekst jest obecny na stronie. Sprawdzanie poprawności elementu przez ID jest dość proste, kup próbując zrobić to z tekstem nie działa poprawnie. I nie mogę znaleźć poprawnego atrybutu dla By do sprawdzania poprawności tekstu na stronie internetowej.Sprawdzanie, czy element jest obecny przy użyciu "Przez" z Selenium Webdriver i Python

Przykład, który pracuje dla ID używając Przez atrybutu

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

przykładu Próbuję użyć (nie działa) dla tekstu przy użyciu Przez atrybutu

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

mam wypróbowane również, z * błędem (poniżej)

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

i

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

* Błąd: AttributeError: obiekt 'WebDriver' nie ma atrybutu 'is_element_present'

Mam ten sam problem, gdy próbuje potwierdzić By.Image również.

+0

które importowane 'z importu selenium.webdriver.common.by By' – Dave

+0

Czy widzisz' By.ID'? – Dave

+0

Widzę 'Identyfikator'' ID' 'name'' xpath' 'dom'' sizzle_selector' 'link_text'' css_selector' 'tag_name'' defaults' oraz 'key_attributes' – Dave

Odpowiedz

2

Po pierwsze, nie należy tego robić, lepiej zmienić logikę testowania niż znaleźć tekst na stronie.

Oto jak utworzyć jesteś właścicielem is_text_present metody jednak, jeśli naprawdę chcesz go używać:

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 

przypadku obrazów, logika jest zdać lokalizatora do niego. (Nie sądzę is_element_present istnieje w WebDriver API choć nie wiem, jak masz By.ID działa, załóżmy, że to działa.)

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

Jesteś na drodze martwy. Mój czek nie powiódł się. – Dave

5

Z tego co widziałem, is_element_present są generowane przez rozszerzenie Firefoksa (Selen IDE) i wygląda następująco:

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

"na" jest importowany z selenium.webdriver.common:

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

Istnieje kilka "na" stałe wobec każdego find_element_by_ API * Tak więc, na przykład:

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

sprawdza, czy związek występuje, a jeśli nie, to unika się wyjątek podniesiony przez selen, umożliwiając tym samym prawidłowe unittest zachowanie.

+0

To jest ten :) – Axel

0

lubię owijania całość w niestandardowym twierdzenie

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]')