2015-04-06 2 views
12

Stavo leggendo la documentazione SeleniumHQ e ho trovato le seguenti dichiarazioni.Chiarimento della causa del mix Attese implicite ed esplicite di Selenium doc

"ATTENZIONE:.. Non mescolare attese implicite ed esplicite Ciò potrebbe causare tempi di attesa imprevedibili Per impostare un implicito un'attesa di 10s e un'attesa esplicita di 15 secondi ad esempio, potrebbe causare un timeout si verifichi dopo 20 secondi. "

Per qualche motivo, non riesco a farlo avere senso. Il timeout totale di 20 è il principale punto di confusione per me. Qualcuno può spiegare se mi manca qualcosa?

EDIT

La mia domanda non è circa l'attuazione/conseguenze di miscelazione quelle attese. Riguarda interamente le dichiarazioni e il calcolo del timeout sul documento.

2 ° Modifica

Sembra che il doc è corretta in base alle prove di seguito. Ho ancora bisogno della spiegazione se.

solo aspettare implicito

using System; 
using System.Diagnostics; 
using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 

namespace Test 
{ 
    [TestFixture] 
    public class Test 
    { 
     private IWebDriver _webDriver; 

     [Test] 
     public void ExplicitVsImplicitWaitTest() 
     { 
      _webDriver = new ChromeDriver(); 
      _webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
      _webDriver.Navigate().GoToUrl("https://www.google.com/"); 
      _webDriver.Manage().Window.Maximize(); 

      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 

      try 
      { 
       //new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
       //ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); 
       _webDriver.FindElement(By.CssSelector("Should Fail")); 
      } 
      catch (NoSuchElementException exception) 
      //catch (OpenQA.Selenium.WebDriverTimeoutException) 
      { 
       stopwatch.Stop(); 
       Console.WriteLine(stopwatch.Elapsed); 
      } 

      _webDriver.Quit(); 

     } 
    } 
} 

tempo in secondi: 00: 00: 10,0167290

solo aspettare esplicita

using System; 
using System.Diagnostics; 
using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Support.UI; 

namespace Test 
{ 
    [TestFixture] 
    public class Test 
    { 
     private IWebDriver _webDriver; 

     [Test] 
     public void ExplicitVsImplicitWaitTest() 
     { 
      _webDriver = new ChromeDriver(); 
      //_webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
      _webDriver.Navigate().GoToUrl("https://www.google.com/"); 
      _webDriver.Manage().Window.Maximize(); 

      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 

      try 
      { 
       new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
       ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); 
       _webDriver.FindElement(By.CssSelector("Should Fail")); 
      } 
      //catch (NoSuchElementException exception) 
      catch (OpenQA.Selenium.WebDriverTimeoutException) 
      { 
       stopwatch.Stop(); 
       Console.WriteLine(stopwatch.Elapsed); 
      } 

      _webDriver.Quit(); 

     } 
    } 
} 

Tempo in seconda: 00:00 : 15.2463079

misto, esplicite ed implicite sia

using System; 
using System.Diagnostics; 
using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Support.UI; 

namespace Test 
{ 
    [TestFixture] 
    public class Test 
    { 
     private IWebDriver _webDriver; 

     [Test] 
     public void ExplicitVsImplicitWaitTest() 
     { 
      _webDriver = new ChromeDriver(); 
      _webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
      _webDriver.Navigate().GoToUrl("https://www.google.com/"); 
      _webDriver.Manage().Window.Maximize(); 

      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 

      try 
      { 
       new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until(
       ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); 
       _webDriver.FindElement(By.CssSelector("Should Fail")); 
      } 
      //catch (NoSuchElementException exception) 
      catch (OpenQA.Selenium.WebDriverTimeoutException) 
      { 
       stopwatch.Stop(); 
       Console.WriteLine(stopwatch.Elapsed); 
      } 

      _webDriver.Quit(); 

     } 
    } 
} 

tempo in secondi: 00: 00: 20,5771817

+0

Molte risposte su SO !!! http://stackoverflow.com/a/15174978/3124333 http://stackoverflow.com/a/28067495/3124333 – SiKing

+0

@SiKing Grazie per il tuo tempo e ** DOWNVOTE **. La mia confusione non è sull'implementazione * Sono confuso riguardo al calcolo dei timeout ** 20s ** sul doc. Volevo sapere come sono usciti con ** 20s ** e probabilmente il link che hai fornito non parla della stessa cosa di cui sto parlando qui – Saifur

+1

@SiKing: sono d'accordo che ci sono molte risposte ma nessuna di esse giustifica come il tempo di attesa è calcolato – LittlePanda

risposta

16

La mia domanda non riguarda l'attuazione di tali attese. Riguarda interamente le dichiarazioni e il calcolo del timeout sul documento.

Ma devi sapere come sono implementati per dare un senso a quello che sta succedendo. Ecco cosa succede con il tuo mix dei due tipi di attese. Sto scavalcando quei passaggi che non sono importanti per la discussione.

  1. Lo script imposta un'attesa implicita.

  2. Lo script avvia un'attesa esplicita per verificare se l'elemento esiste. L'attesa esplicita funziona tramite polling. Quindi invia un comando al browser per verificare l'esistenza dell'elemento.

  3. A causa dell'attesa implicita già impostata, il comando inviato al browser impiega 10 secondi per restituire un errore.

  4. L'attesa esplicita controlla se ha raggiunto il limite di tempo di 15 secondi. È attualmente a 10 secondi (+ una piccola quantità di tempo impiegata per eseguire lo script, la latenza di rete, ecc.) Nell'attesa, che è meno di 15 secondi. Quindi non è fatto in attesa e riemette lo stesso comando del punto 2 sopra.

  5. A causa dell'attesa implicita, il comando inviato al browser impiega 10 secondi per restituire un errore.

  6. Quando l'attesa esplicita verifica nuovamente il proprio timeout, sono trascorsi più di 15 secondi, quindi è scaduto.

Così i espliciti attesa urne due volte, e ogni volta che prende 10 secondi che significano 20 secondi totale (più una piccola quantità di tempo per conto per la contabilità).

Un'attesa esplicita non fa nulla per rilevare e compensare un'attesa implicita che è stata impostata. E non continua a funzionare in parallelo ai comandi che invia al browser. Mentre viene eseguito un comando del browser, l'attesa esplicita non sta facendo alcuna contabilità o è in grado di scadere. Deve attendere il completamento del comando del browser prima di verificare se dovrebbe scadere.

+2

Grande spiegazione. Anch'io ho strane attese di incoerenza, il tuo post mi ha aiutato a capire il meccanismo (anche se probabilmente ho un altro problema, i miei "sintomi" sono un po 'diversi). – Stas