2013-03-01 22 views
10

miei due scenari -Combinando attesa implicita ed attesa esplicita insieme i risultati in tempi di attesa inaspettati

1) Prima

@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 conducente 45 secondi per cercare il testo (che si prevede)

2) In secondo luogo

@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 offre al conducente 30 secondi per cercare il testo (non previsto)

C'è un modo per fare in modo che il selenio attenda solo il tempo di attesa explicit e non per il maggiore dei due?

Nota: non dichiarare che il tempo di attesa implicito non è un'opzione, poiché non posso permettermi di lasciare che il selenio si blocchi ogni volta che il driver non è in grado di trovare qualcosa.

Utilizzando Selenio versione 30, le finestre, ff

+0

'L'impostazione predefinita è 0' in base ai documenti di attesa impliciti, quindi qual è esattamente il problema qui? – phoet

+0

Perché non impostare anche l'attesa implicita su 5? – BlackHatSamurai

+0

L'attesa implicita mi aiuta a mantenere un'attesa predefinita su ogni singolo elemento, quindi non voglio mantenerla a partire da 5 secondi. Voglio usare un periodo di attesa più breve (ad esempio "wait_to_fail") per controllare gli elementi * non * presenti. – Amey

risposta

39

Non mescolare 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é è possibile utilizzare più volte il lato locale e quello remoto del sistema.

Ecco come funzionerebbe: 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.

Così, quando si tenta di mescolare le attese implicite ed esplicite, si è passati a 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 si verificano "blocchi" quando non è possibile trovare un elemento se non si stanno utilizzando attese implicite. Il driver dovrebbe lanciare immediatamente un'eccezione NoSuchElement.

+0

Grazie per la risposta. Quindi il problema è in realtà con il fatto che il mio script si blocca rispetto al fallimento immediatamente. Questo sarebbe un problema di rubino di un web di selenio? – Amey

+0

Intendi dire che quando le attese implicite non sono impostate (o impostate su zero), il codice WebDriver si blocca indefinitamente? C'è stato un problema con esattamente questi sintomi usando Firefox, ma è stato corretto in 2.30.0. Se stai impostando l'attesa implicita su qualsiasi cosa diversa da zero, allora sì, naturalmente WebDriver si "bloccherà" fino al timeout se l'elemento non esiste. Cosa succede quando usi altri browser? Che dire dell'aggiornamento a 2.31? – JimEvans

+0

Ho postato una [domanda correlata] (http://stackoverflow.com/questions/20268396/mixing-implicit-and-explicit-waits) (Sono confuso su questo) – KnewB

-3

La procedura consigliata è 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. Si dovrebbe annullare implicitamenteWait() prima di chiamare WebDriverWait perché implicitamenteWait() imposta anche il tempo di attesa "driver.findElement()".

Ogni volta che si utilizza WebDriverWait() con implicitlyWait() già impostato un valore di partenza, seguire i passaggi -

  1. annullando implicitlyWait()
  2. esecuzione WebDriverWait(), e restituire elemento
  3. ripristino implicitlyWait() di nuovo

Esempio 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); 
+0

Dovresti aggiungere la sorgente del codice, perché è il codice copiato e non il tuo. – SysDragon