Sto spostando alcuni test da Selenium al WebDriver. Il mio problema è che non riesco a trovare un equivalente per selenium.wait_for_condition. Le associazioni Python hanno questo al momento o sono ancora pianificate?selenium.wait_for_condition equivalente in binding Python per WebDriver
risposta
Attualmente non è possibile utilizzare wait_for_condition con WebDriver. Il codice del selenio pitone fornisce la classe DrivenSelenium per accedere ai vecchi metodi di selenio, ma non può attendere wait_for_condition. The selenium wiki has some info on that.
La soluzione migliore è utilizzare la classe WebDriverWait. Questa è una classe helper che esegue periodicamente una funzione in attesa che restituisca True. Il mio uso generale è
driver = webdriver.Firefox()
driver.get('http://example.com')
add = driver.find_element_by_id("ajax_button")
add.click()
source = driver.page_source
def compare_source(driver):
try:
return source != driver.page_source
except WebDriverException:
pass
WebDriverWait(driver, 5).until(compare_source)
# and now do some assertions
Questa soluzione non è affatto ideale .. Il try/tranne che è necessario per le situazioni in cui il ciclo di richiesta di pagina/risposta è ritardata in attesa di qualche attività di ajax per completare. Se compare_source viene chiamato nel mezzo del ciclo di richiesta/risposta, genererà un'eccezione WebDriverException.
Il test coverage for WebDriverWait è anche utile da guardare.
L'associazione Java include una classe Wait. Questa classe controlla ripetutamente una condizione (con sleeps tra) fino al raggiungimento di un timeout. Se riesci a rilevare il completamento del tuo Javascript utilizzando la normale API, puoi seguire lo stesso approccio.
Ecco la mia versione della risposta di Greg Sadetsky, messo in una funzione:
def click_n_wait(driver, button, timeout=5):
source = driver.page_source
button.click()
def compare_source(driver):
try:
return source != driver.page_source
except WebDriverException:
pass
WebDriverWait(driver, timeout).until(compare_source)
Si fa clic sul pulsante, attende il DOM di cambiare e poi ritorna.
Sembra che tu possa testare la visibilità. 'da selenium.webdriver.support importate condizioni_aspese come ec' e quindi' ec.visibility_of (elm) '. L'oggetto di ritorno è "selenium.webdriver.support.expected_conditions.visibility_of', ma non ho capito come ottenerne la visibilità. – huggie