2014-06-05 9 views
9

Obecnie piszę test webdriver dla wyszukiwania, który używa ajax dla sugestii. Test działa dobrze, jeśli dodaję wyraźne oczekiwanie po wpisaniu treści wyszukiwania i przed naciśnięciem klawisza Enter.webdriver czekać na żądanie ajax w python

wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama") 
time.sleep(2) 
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN) 

ale

wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama") 
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN) 

zawiedzie. Mam testy na ec2 z 1 wirtualnym cpu. Podejrzewam, że nacisnąłem klawisz enter, zanim jeszcze otrzymam żądania GET związane z wyszukiwaniem i jeśli naciśniesz enter przed sugestiami, to się nie powiedzie.

Czy istnieje lepszy sposób dodawania wyraźnych oczekiwań?

Odpowiedz

11

Ty rzeczywiście może dodać wyraźnie czekać na obecność elementu jak

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 
from selenium.webdriver.support import expected_conditions as EC# available since 2.26.0 

ff = webdriver.Firefox() 
ff.get("http://somedomain/url_that_delays_loading") 
ff.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama") 

try: 
    element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "keywordSuggestion"))) 
finally: 
    ff.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN) 
    ff.quit() 

Patrz: http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits

-1

A co:

driver.implicitly_wait(10) 

dla przykładu:

wd.implicitly_wait(10) 

W tym przypadku za każdym razem, gdy zamierzasz kliknąć lub znaleźć sterownik elementu, spróbujesz wykonać to działanie co 0,5 sekundy przez 10 sekund. W takim przypadku nie musisz dodawać czekać za każdym razem. Uwaga: Ale chodzi tylko o element na ekranie. Nie będzie czekać, aż pewne działania JS się zakończą.