12

La Storia:frequenza sondaggio Controllo di browser.wait() (Wait perfetto)

in Java binding di linguaggio selenio c'è una FluentWait class, che permette di controllare strettamente come la condizione prevista sarebbe controllato:

Ogni istanza di FluentWait definisce la quantità massima di tempo di attesa per per una condizione, nonché la frequenza con cui controllare la condizione . Inoltre, l'utente può configurare l'attesa per ignorare i tipi specifici di eccezioni durante l'attesa, come ad esempio NoSuchElementExceptions durante la ricerca di un elemento nella pagina.

In altre parole, è possibile modificare l'intervallo di polling in cui viene applicato il controllo di condizione previsto, che è di default 500ms. Inoltre, è possibile impostare eccezioni da ignorare.

È also possible in Python, ci sono argomenti rilevanti poll_frequency e ignored_exceptions nella classe WebDriverWait.

la domanda:

È possibile controllare la frequenza sondaggio in cui la condizione prevista è verificata quando si utilizza browser.wait() in Goniometro/WebDriverJS?


Secondo la browser.wait() documentation, ci sono solo 3 possibili argomenti: una funzione che è una condizione prevista, un valore di timeout e un messaggio di errore di timeout opzionale. Spero che ci sia una diversa impostazione o un modo per cambiare la frequenza del sondaggio.

+2

Da [questo] (https://github.com/SeleniumHQ/selenium/blob/master/javascript/webdriver/webdriver.js#L657) Sembra JS il polling veloce come si può. Quindi in pratica non penso che abbia il parametro che vuoi. Ma immagino che 2 possibili soluzioni potrebbero essere: 1. Scrivi una 'Condizione' personalizzata, che dorme internamente se la condizione non è vera prima che ritorni 2. Costruisci' Promessa' invece, che si comporta diversamente secondo lo stesso documento 3. La terza opzione è riscrivere 'wait' o avvolgerlo in alcune funzioni personalizzate. Non è una buona opzione però. –

+0

@KirilS. fatto qualche altra ricerca e riassunto il tuo punto in una risposta. Grazie ancora! – alecxe

risposta

9

Con l'aiuto di @Kirill S., dopo l'ulteriore ricerca e ispezionare il WebdriverJS source code, posso concludere che non esiste una cosa come "la frequenza sondaggio" in javascript attacchi selenio. L'intervallo tra le successive chiamate di controllo delle condizioni non può essere configurato - esegue il controllo il più rapidamente possibile.

Questo non è lo stesso di, ad esempio i collegamenti di selenio Python o Java, in cui è presente un timeout configurabile tra i controlli dello stato delle condizioni previste. Per impostazione predefinita, it would wait for 500ms before the next check:

WebDriverWait di default chiama l'ExpectedCondition ogni 500 millisecondi finché non ritorna con successo. Un risultato positivo è per Il tipo ExpectedCondition è valore restituito booleano true o not null per tutti gli altri tipi di ExpectedCondition.

1

Bene, secondo i documenti che ho letto, non sembra essere un metodo effettivo che rispecchia la funzionalità dello FluentWait. Invece, questo frammento può essere usato per cambiare la frequenza del sondaggio e fugge quasi tutte le eccezioni (quasi tutte).

def wait_until(predicate, timeout_seconds, period=0.25, show_log=True): 
    """ 
    @summary Call repeatedly the predicate until it returns true or timeout_seconds passed. 
    @param predicate: a condition, modelized as a callable, that will valued either as True or False 
    @param timeout_seconds: the timeout in second 
    @param period: the time to sleep between 2 calls to predicate. Defaults to 0.25s. 
    @return True if a call to predicate returned True before timeout_seconds passed, else False 
    """ 
    if show_log: 
     myLogger.logger.info("waiting until predicate is true for {end} seconds".format(end=timeout_seconds)) 
    ultimatum = time.time() + timeout_seconds 
    while time.time() < ultimatum: 
     myLogger.logger.debug("checking predicate for wait until : {spent}/{end}".format(spent=str(time.time() - (ultimatum - timeout_seconds)), end=timeout_seconds)) 
     try: 
      if predicate(): 
       return True 
      time.sleep(period) 
     except Exception as e: 
      myLogger.logger.warn("Exception found: {}".format(e)) 
    return False 

Di conseguenza, il predicato può essere lambda che si passa che convalida lo stato della WebElement in discussione.

+0

Grazie per aver partecipato! È una soluzione basata su Python? .. la domanda è su Protractor/WebDriverJS .. – alecxe

+0

Sì, è basato su Python, ma suppongo che la stessa idea possa essere applicata in javascript. – Abhinav

+0

Ti è stato d'aiuto qualcosa del genere? – Abhinav