La combinazione di attesa implicita ed attesa esplicita insieme determina tempi di attesa imprevisti

I miei due scenari –

1) Primo

@driver.manage.timeouts.implicit_wait = 30 @wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit @wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

Che dà al guidatore 45 secondi per cercare il testo (che è previsto)

2) Secondo

 @driver.manage.timeouts.implicit_wait = 30 @wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit @wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

Questo ora dà al conducente 30 secondi per cercare il testo (non previsto)

C’è un modo per far sì che il selenium aspetti solo il tempo di attesa explicit e non il maggiore dei due?

Nota – Non dichiarare che il tempo di attesa implicito non è un’opzione, perché non posso permettermi di lasciarmi bloccare il selenium ogni volta che il driver non è in grado di trovare qualcosa.

Usando la versione 30 di Selenium, windows, ff

Solutions Collecting From Web of "La combinazione di attesa implicita ed attesa esplicita insieme determina tempi di attesa imprevisti"

Non mescolare le attese implicite ed esplicite. Parte del problema è che le attese implicite sono spesso (ma potrebbero non essere sempre!) Implementate sul lato “remoto” del sistema WebDriver. Ciò significa che sono “integrati” in IEDriverServer.exe, chromedriver.exe, l’estensione di WebDriver per Firefox che viene installata nel profilo anonimo di Firefox e nel server WebDriver remoto Java (selenium-server-standalone.jar). Le attese esplicite sono implementate esclusivamente nei binding di lingua “locale”. Le cose diventano molto più complicate quando si utilizza RemoteWebDriver, perché è ansible utilizzare più volte il lato locale e quello remoto del sistema.

Funzionerebbe così: codice locale -> server remoto Java -> collegamenti locali in linguaggio Java sul server remoto -> componente “remoto” come l’estensione di Firefox, chromedriver.exe o IEDriverServer.exe. È ancora più complesso nel caso della griglia, poiché potrebbero esserci altri luppoli nel mezzo.

Quindi, quando provi a mescolare le attese implicite ed esplicite, ti sei perso in un “comportamento indefinito”. Potresti essere in grado di capire quali sono le regole di quel comportamento, ma saranno soggette a modifiche man mano che i dettagli di implementazione dei driver cambiano. Quindi non farlo.

Non dovresti riscontrare “blocco” quando non è ansible trovare un elemento se non stai utilizzando attese implicite. Il driver dovrebbe lanciare immediatamente un’eccezione NoSuchElement.

La procedura migliore consiste nell’impostare implicitamenteWait () all’inizio di ciascun test e utilizzare WebDriverWait () per attendere un elemento o l’elemento AJAX da caricare.

Tuttavia, implicitamenteWait () e WebDriverWait () non funzionano bene insieme nello stesso test. Dovresti annullare implicitamenteWait () prima di chiamare WebDriverWait perché implicitamenteWait () imposta anche il tempo di attesa “driver.findElement ()”.

Ogni volta che si utilizza WebDriverWait () con implicitamenteWait () già impostato un valore iniziale, seguire i passaggi –

  1. annullando implicitamente Wait ()
  2. eseguendo WebDriverWait () e restituisci elemento
  3. resettare implicitamenteWait () di nuovo

Esempio di codice Java –

 driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); element = wait.until(ExpectedConditions.visibilityOfElementLocated(by)); driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS);