English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il metodo di test del WebDriver di Selenium che abbiamo presentato prima si basa sul web. Gli esempi precedenti utilizzavano semplici pagine web per operare, potrebbero non percepire il processo di caricamento delle pagine web, ma nel processo di applicazione reale, il caricamento delle pagine web richiede un certo tempo. Il tuo script è già in esecuzione, ma l'elemento che devi localizzare non è ancora stato caricato, in questo caso verrà segnalato un errore di elemento non trovato. È ovvio che uno script che non considera il tempo di caricamento non è un script di successo. Oggi vi presenteremo come impostare il tempo di attesa.
Tre metodi di attesa
time.sleep(n)
L'attesa forzata di n secondi è una funzione nativa di Python, inclusa nel pacchetto time, che deve essere importata prima di essere utilizzata. Questo metodo di attesa è stato utilizzato spesso nei nostri esempi precedenti, per rendere più chiari i risultati dell'esecuzione dello script. Questo metodo di attesa è molto ingenuo, indipendentemente dal caricamento della pagina, deve aspettare n secondi, può essere considerato molto non intelligente.
implicitly_wait(n)
L'attesa massima di n secondi, se la pagina viene caricata entro n secondi, termina l'attesa anticipatamente. È un metodo di attesa fornito da WebDriver, noto anche come attesa implicita, è un po' più intelligente dell'attesa forzata, ma se la pagina contiene file molto grandi come video, anche se l'elemento da localizzare è stato caricato all'inizio, deve aspettare che tutti i file siano caricati prima di continuare l'esecuzione dello script, quindi ha ancora alcuni svantaggi.
WebDriverWait(n)
L'attesa massima di n secondi, ogni n secondi verifica se l'elemento da localizzare esiste, se esiste termina l'attesa anticipatamente. È un metodo di attesa fornito da WebDriver, noto anche come attesa esplicita, che è un po' più intelligente dell'attesa implicita, ignora il caricamento dell'intera pagina, termina l'attesa non appena l'elemento necessario esiste.
Esempio
L'attesa forzata è stata utilizzata in molti esempi precedenti, quindi vediamo i due metodi di attesa forniti da WebDriver
Attesa implicita
In effetti, l'attesa implicita è stata utilizzata anche nelle precedenti introduzioni, ma non è stata menzionata in particolare il metodo di utilizzo. Questa volta apriamo la homepage di NetEase, un portale con molti contenuti che deve caricarsi secondo la velocità di connessione, circa 10 secondi, quindi impostiamo il tempo di attesa a 60 secondi e calcoliamo quanto tempo ci vuole per aprire il pulsante [Corso pubblico] nella barra di navigazione della pagina.
# coding = utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(60) #Tempo di attesa implicito 60 secondi time_start = time.time() #Registra il tempo quando la pagina è stata aperta driver.get('https://www.163.com/') driver.find_element_by_id('js_love_url').click() time_end = time.time() #Registra il tempo dopo aver fatto clic sul pulsante print('tempo di accesso è: ', time_end - time_start) #Stampa la differenza di tempo, ovvero il tempo effettivo consumato time.sleep(2) #Forza l'attesa di 2 secondi per osservare se abbiamo effettivamente aperto la pagina [Corso pubblico] driver.quit()
La esecuzione dello script è terminata. Anche se abbiamo impostato un tempo nascosto di 60 secondi, la pagina è stata caricata entro circa 5 secondi (vedi i risultati di esecuzione sotto). È possibile fare clic sul pulsante [Corso pubblico]. Di seguito è riportato il mio risultato di esecuzione, che mostra l'intero tempo di caricamento.
>>>access time is : 5.717327117919922
Attesa esplicita
Quando si utilizza l'attesa esplicita, è necessario importare la classe WebDriverWait di selenium.webdriver.support.wait, le API sono come segue:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
Poiché l'attesa esplicita potrebbe richiedere di confermare l'esistenza dell'elemento, di solito deve essere utilizzato insieme ai seguenti due metodi
until(method, message='') until_not(method, message='')
Attenzione, method() deve essere un metodo invocabile, deve avere il metodo __call__(). Riscriviamo l'esempio sopra.
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait import time driver = webdriver.Chrome() class button(): def __call__(self, driver): if driver.find_element_by_id('js_love_url'): return True else: return False driver.implicitly_wait(60) time_start = time.time() driver.get('https://www.163.com/') # driver.find_element_by_id('js_love_url').click() WebDriverWait(driver,2,0.5).until(button()) time_end = time.time() print('access time is : ', time_end - time_start) time.sleep(2) driver.quit()
看完这个例子可能会有疑问,我显性等待明明设置了是2秒,为什么没有报错呢。因为我们同时也设置了隐性等待时间,两者时间取最长的等待时间为实际等待时间,因此在这里例子里,等待的时间还是60秒。
总结
1、Selenium可以采取三种等待,最智能的为显性等待WebDriverWait()
2、隐性等待和显性等待同时存在时,取两者中最长的等待时间为有效等待时间
3、显性等待中的until(method())的method()为可调用方法,可以自己定义,也可以用匿名函数等方法,这个我们以后细谈
4、隐性等待设置一次,即贯穿整个脚本始终,强制等待则必须在每个需要等待之处设置
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。