web-dev-qa-db-fra.com

Comment définir le délai d'attente du pilote Web Selenium?

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

Ceci est 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 sera bloqué pour toujours, mais je veux qu'il attende 30 secondes et si la page n'est pas chargée, lancez une exception.

29
福气鱼

Essaye ça:

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

Les méthodes timeouts() ne sont pas implémentées dans certains pilotes et sont très peu fiables en général.
J'utilise un thread distinct pour les délais d'attente (en passant l'URL à accéder en tant que nom du thread):

    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 peut arriver que le pilote soit vraiment bloqué et que tout appel ultérieur de ce dernier soit bloqué (ce que je constate avec le pilote Chrome sous Windows). Même quelque chose d'aussi anodin qu'un appel driver.findElements () pourrait être bloqué. Malheureusement, je n'ai aucune solution pour les pilotes bloqués.

23
user1102631

J'ai eu le même problème et grâce à ce forum et à un autre forum, j'ai trouvé la réponse… .. Au départ, j'ai aussi pensé à un fil séparé, mais cela complique un peu le code. Alors j'ai essayé de trouver une réponse qui correspond à 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);

Une chose est qu’elle lève timeoutException, vous devez donc l’encapsuler dans le bloc catch catch ou intégrer 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é puisque mon script a été gelé pendant plusieurs heures et que rien n'a été déplacé.

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

5
Lukasz

Ajouter 

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

Je ne ferai rien. La page bloquera très longtemps.

2
zhongting

Vous pouvez définir la temporisation 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);
2
flob

La solution de driver.manage (). Timeouts (). PageLoadTimeout (10, TimeUnit.SECONDS) fonctionnera sur les pages avec chargement synchronisé, mais cela ne résout pas le problème du chargement de pages en mode asynchrone, les tests échoueront tous l'heure si nous définissons la pageLoadTimeOut.

1
sou

Je trouve que les appels avec délai d'attente ne sont pas suffisamment fiables dans la vie réelle, en particulier pour Internet Explorer, mais les solutions suivantes peuvent être utiles:

  1. Vous pouvez expirer le test complet en utilisant @Test (timeout = 10000) dans le test Junit à partir duquel vous exécutez le processus Selenium. Cela libérera le thread principal pour l'exécution des autres tests, au lieu de bloquer l'ensemble du spectacle. Cependant, même cela ne fonctionne pas parfois.

  2. Quoi qu’il en soit, si vous extrayez le délai imparti, vous n’avez pas l’intention de sauver le scénario de test, car l’exécution même d’une seule opération risque de laisser la séquence de tests entière dans un état incohérent. Vous voudrez peut-être simplement continuer avec les autres cas de test sans bloquer (ou peut-être réessayer le même test). Dans ce cas, une méthode infaillible consiste à écrire un interrogateur qui interroge les processus de Webdriver (par exemple, IEDriverServer.exe, Phantomjs.exe) pendant plus de 10 minutes et les tue. Vous trouverez un exemple à l'adresse suivante: Identifiez automatiquement (et supprimez) les processus dont le temps de traitement est long

0
premganz

Utilisé sous le code dans une situation similaire

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

et du code driver.get intégré dans une capture d’essai, ce qui a résolu le problème du chargement de pages prenant plus d’une minute.

0
Manjunath24