2014-06-05 8 views
9

Derzeit schreibe ich Webdriver Test für die Suche, die Ajax für Vorschläge verwendet. Der Test funktioniert gut, wenn ich nach Eingabe des Suchinhalts und vor dem Drücken der Eingabetaste explizit warten.webdriver warten auf Ajax Anfrage in 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) 

aber

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) 

ausfällt. Ich führe Tests auf ec2 mit 1 virtueller CPU durch. Ich vermute, ich drückte die Eingabetaste, noch bevor GET-Anfragen im Zusammenhang mit der Suche gesendet werden und wenn ich die Eingabetaste vor den Vorschlägen drücke, schlägt es fehl.

Gibt es einen besseren Weg, explizite Wartezeiten hinzuzufügen?

Antwort

11

in der Tat können Sie eine explizite Warten auf das Vorhandensein eines Elements wie

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

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

-1

Und was ist:

driver.implicitly_wait(10) 

für Ihr Beispiel:

wd.implicitly_wait(10) 

In diesem Fall versuchen Sie jedes Mal, wenn Sie klicken oder den Elementtreiber finden, diese Aktion alle 0,5 Sekunden während 10 Sekunden auszuführen. In diesem Fall müssen Sie nicht jedes Mal warten. Hinweis: Aber es geht nur um Element auf dem Bildschirm. Es wird nicht warten, bis einige JS-Aktionen beendet sind.

Verwandte Themen