English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ho scoperto che molte persone non sanno come usare l'attesa, oggi non posso fare a meno di spiegare l'importanza dell'attesa.
Molte persone nella chat chiedono, questo menu a discesa non può essere localizzato, quella finestra emergente non può essere localizzata... vari problemi di localizzazione non trovati. In realtà, nella maggior parte dei casi ci sono solo due problemi: 1 ci sono frame, 2 non è stato aggiunto l'attesa. Non si sa quanto sia veloce la velocità di esecuzione del codice, e quanto sia veloce la velocità di caricamento e rendering del browser, è come se Flash e Ultraman avessero concordato di combattere il mostro, poi Flash torna indietro e chiede a Ultraman perché non è uscito ancora, indossando le scarpe. Ultraman passa attraverso un milione di capre nel cuore, accusa Flash di essere veloce e dice che non gioca più con lui, lancia un'eccezione e lascia la scena.
Allora come possiamo tener conto della lenta velocità di caricamento di Ultraman? C'è solo un modo, aspettare. Parlando di aspettare, ci sono tre modi di aspettare, ascoltami spiegare uno per uno:
1. Attesa forzata
Il primo metodo è anche il più semplice e più brutale, ossia l'attesa forzata sleep(xx), che forza Flash a aspettare per xx secondi, indipendentemente dal fatto che Ultraman possa stare al passo o sia arrivato prima, deve aspettare per xx secondi.
Guarda il codice:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get('https://huilansame.github.io') sleep(3) # Attesa forzata di 3 secondi prima di eseguire il passo successivo print driver.current_url driver.quit()
Questo si chiama attesa forzata, indipendentemente dal fatto che il browser sia stato caricato o meno, il programma deve aspettare 3 secondi. Una volta trascorsi 3 secondi, si continua a eseguire il codice seguente. È molto utile per il debug, a volte si può aspettare così nel codice, ma non si consiglia di usarlo sempre, è troppo rigido e può influenzare notevolmente la velocità di esecuzione del programma.
2. Attesa invisibile
Il secondo metodo si chiama attesa invisibile, implicitly_wait(xx), il significato dell'attesa invisibile è: Flash e Ultraman hanno concordato che, indipendentemente da dove Flash vada, deve aspettare Ultraman per xx secondi. Se Ultraman arriva entro questo tempo, i due partono immediatamente per combattere il mostro. Se Ultraman non arriva entro il tempo stabilito, Flash parte da solo. Naturalmente, aspetta che Ultraman ti lanci un'eccezione.
Guarda il codice:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(30) # Attesa invisibile, massimo 30 secondi driver.get('https://huilansame.github.io') print driver.current_url driver.quit()
L'attesa invisibile stabilisce un tempo massimo di attesa, se la pagina web si carica entro il tempo stabilito, si esegue il passo successivo, altrimenti si aspetta fino alla scadenza del tempo e poi si esegue il passo successivo. Attenzione, c'è un difetto qui, ovvero il programma aspetta che l'intera pagina sia completamente caricata, ossia solitamente quando vedi il cerchio che gira nella barra dei tag del browser smette di girare, allora si esegue il passo successivo, ma a volte gli elementi che si desiderano sono già stati caricati, ma a causa di alcuni script molto lenti, devo aspettare che la pagina sia completamente completata prima di eseguire il passo successivo. Cosa posso fare quando voglio che il passo successivo venga eseguito dopo che l'elemento desiderato è apparso? C'è un modo, e questo dipende da un altro modo di attesa fornito da selenium - l'attesa esplicita wait.
Occorre precisare che l'attesa implicita è efficace per tutto il ciclo del driver, quindi è sufficiente impostarla una volta. Ho visto qualcuno usare l'attesa implicita come sleep ovunque...
3. Attesa esplicita
Il terzo metodo è l'attesa esplicita, WebDriverWait, utilizzato insieme ai metodi until() e until_not() della classe per attendere in modo flessibile in base alle condizioni di judgment. Il suo significato principale è: il programma controlla ogni xx secondi, se la condizione è soddisfatta, esegue il passo successivo, altrimenti continua a attendere, fino a che non viene superato il tempo massimo impostato, quindi viene lanciata l'eccezione TimeoutException.
Ecco un esempio di codice:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.implicitly_wait(10) # L'attesa implicita e l'attesa esplicita possono essere utilizzate contemporaneamente, ma attenzione: la durata massima di attesa è quella maggiore tra le due driver.get('https://huilansame.github.io') locator = (By.LINK_TEXT, 'CSDN') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) print driver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
In the above example, we set implicit and explicit waits, in other operations, implicit waiting plays a decisive role, in WebDriverWait.. explicit waiting plays a main role, but it should be noted that: the longest waiting time depends on the larger of the two, in this case it is 20, if the implicit waiting time is greater than the explicit waiting time, then the longest waiting time of this sentence of code is equal to the implicit waiting time.
We mainly use the WebDriverWait class and the expected_conditions module, let's take a detailed look at these two modules:
WebDriverWait
The WebDriverWait class in the wait module is an explicit wait class, let's take a look at what parameters and methods it has:
selenium.webdriver.support.wait.WebDriverWait (class) __init__ driver: Pass in a WebDriver instance, that is, the driver in our previous example timeout: Timeout time, the longest waiting time (considering the implicit waiting time as well) poll_frequency: The interval time for calling the method in until or until_not, the default is 0.5 seconds ignored_exceptions: Exceptions to be ignored, if this tuple of exceptions is thrown during the call to until or until_not, then do not interrupt the code, continue to wait, if the exception thrown is not in this tuple, then interrupt the code and throw the exception. The default is NoSuchElementException. until method: During the waiting period, call this passed-in method at regular intervals until the return value is not False message: If a timeout occurs, throw TimeoutException, pass the message into the exception until_not is the opposite of until, until is executed when an element appears or a condition is met, until_not is executed when an element disappears or a condition does not hold, the parameters are the same, no longer elaborated. method message
After reading the above content, it is basically clear, the calling method is as follows:
WebDriverWait(driver, timeout, polling_frequency, ignored_exceptions).until(executable_method, timeout_message)
It is especially important to pay attention to the executable method parameter method in until or until_not, as many people pass in a WebElement object, as follows:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # Error
Questo è un uso errato, i parametri devono essere chiamabili, ossia l'oggetto deve avere il metodo __call__(), altrimenti viene lanciata un'eccezione:
TypeError: 'xxx' oggetto non è callable
In questo caso, puoi utilizzare vari condizionamenti del modulo expected_conditions forniti da selenium, come i metodi is_displayed() ,is_enabled() ,is_selected() del WebElement, o puoi utilizzare i metodi che tu stesso hai encapsulato, quindi diamo un'occhiata ai condizionamenti forniti da selenium:
expected_conditions
expected_conditions è un modulo di selenium, che contiene una serie di condizioni disponibili per la giudiazione: selenium.webdriver.support.expected_conditions(modulo) Queste due condizioni di condizione verificano il title, verificano se il parametro title è uguale o contiene driver.title title_is title_contains Queste due condizioni verificano se un elemento appare, i parametri passati sono di tipo tupla locator, come (By.ID, 'kw') Come suggerisce il nome, una passa se viene caricato almeno un elemento che soddisfa i requisiti; l'altra richiede che vengano caricati tutti gli elementi che soddisfano i requisiti presence_of_element_located presence_of_all_elements_located Queste tre condizioni verificano se un elemento è visibile, i primi due parametri sono di tipo tupla locator, il terzo è un WebElement Il primo e il terzo sono essenzialmente uguali visibility_of_element_located invisibility_of_element_located visibility_of Queste due condizioni giudicano se un testo specifico appare in un elemento, una giudica il testo dell'elemento, l'altra il valore dell'elemento text_to_be_present_in_element text_to_be_present_in_element_value Questa condizione giudica se frame può essere interrotto, può essere passata una tupla locator o direttamente un metodo di localizzazione: id, name, index o WebElement frame_to_be_available_and_switch_to_it Questa condizione giudica se c'è un alert presente alert_is_present Questa condizione giudica se un elemento è cliccabile, passing locator element_to_be_clickable Queste quattro condizioni giudicano se un elemento è selezionato, la prima condizione passing oggetto WebElement, la seconda condizione passing tuple locator La terza condizione passing oggetto WebElement e stato, se sono uguali restituisce True, altrimenti False La quarta condizione passing locator e stato, se sono uguali restituisce True, altrimenti False element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be L'ultima condizione giudica se un elemento è ancora nel DOM, passing WebElement oggetto, può giudicare se la pagina è stata ricaricata staleness_of
Sopra ci sono tutte le 17 condizioni, combinate con until, until_not, possono realizzare molte giudizi, se possono essere encapsulate in modo flessibile, miglioreranno notevolmente la stabilità dello script.
Oggi condivide queste informazioni, se hai domande puoi lasciare un commento per farmi sapere, spero di aiutare chi ha bisogno. Grazie per il supporto a questo sito!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.