41 votes

Comment définir le délai d'attente pour l'accès à Selenium Webdriver ?

Lorsque j'utilise un proxy dans un webdriver comme FirefoxDriver, si le proxy est mauvais, la méthode get se bloque pour toujours. J'ai défini des paramètres de temporisation, mais cela n'a pas fonctionné.

Voici mon code :

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")

L'appel à driver.get est bloqué pour toujours, mais je veux qu'il attende 30 secondes et que si la page n'est pas chargée, il lève une exception.

38voto

Fujiao Liu Points 1473

Essayez ça :

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

30voto

user1102631 Points 131

Le site timeouts() ne sont pas implémentées dans certains pilotes et sont très peu fiables en général.
J'utilise un fil de discussion séparé pour les délais d'attente (en passant l'url d'accès comme nom de fil) :

Thread t = new Thread(new Runnable() {
    public void run() {
        driver.get(Thread.currentThread().getName());
    }
}, url);
t.start();
try {
    t.join(YOUR_TIMEOUT_HERE_IN_MS);
} catch (InterruptedException e) { // ignore
}
if (t.isAlive()) { // Thread still alive, we need to abort
    logger.warning("Timeout on loading page " + url);
    t.interrupt();
}

Cela semble fonctionner la plupart du temps, mais il se peut que le pilote soit vraiment bloqué et que tout appel ultérieur au pilote soit bloqué (j'ai connu cela avec le pilote Chrome sous Windows). Même quelque chose d'aussi inoffensif qu'un appel à driver.findElements() peut finir par être bloqué. Malheureusement, je n'ai pas de solution pour les pilotes bloqués.

12voto

JasonYou Points 121

Essayez

driver.executeScript("window.location.href='http://www.sina.com.cn'")

cette déclaration sera retournée immédiatement.

Et après cela, vous pouvez ajouter un WebDriverWait avec timeout pour vérifier si le titre de la page ou tout autre élément est correct.

J'espère que cela vous aidera.

7voto

Lukasz Points 229

J'ai eu le même problème et grâce à ce forum et à d'autres, j'ai trouvé la réponse. Au départ, je pensais aussi à un fil séparé mais cela complique un peu le code. J'ai donc essayé de trouver une réponse qui s'aligne sur mon principe "élégance et simplicité".

Veuillez consulter ce forum : https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

#

SOLUTION : Dans le code, avant la ligne avec la méthode 'get' vous pouvez utiliser par exemple :

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

#

Il faut donc l'encapsuler dans le bloc try catch ou l'envelopper dans une méthode.

Je n'ai pas trouvé le getter pour le pageLoadTimeout donc je ne sais pas quelle est la valeur par défaut, mais probablement très élevée puisque mon script a été gelé pendant plusieurs heures et rien n'a avancé.

#

AVIS : L'option 'pageLoadTimeout' n'est PAS implémentée pour le pilote Chrome et provoque donc une exception. J'ai vu dans les commentaires des utilisateurs qu'il est prévu de le faire.

2voto

flob Points 58

Vous pouvez définir le délai d'attente sur le client HTTP comme ceci

int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
      new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X