web-dev-qa-db-fra.com

Comment gérer "l'alerte inattendue ouverte"?

J'ai eu un problème avec Selenium en jetant timeout exception à cause d'une fenêtre contextuelle 

  unexpected alert open
  not provide any stacktrace information)
  Command duration or timeout: 5 milliseconds

L'alerte comporte les boutons OK et CANCEL. Je connais deux façons de gérer cela


La première façon est de rouvrir une nouvelle session

driver.quit();
driver = new ChromeDriver();

La deuxième façon utilise la classe Robot

Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);

Cependant, ces méthodes ne sont pas efficaces du temps. Y a-t-il une meilleure façon?

13
Buras

Cela devrait faire l'affaire:

driver.switchTo().alert().accept();
25
Nathan Merrill

Méthodes pour gérer les alertes dans Selenium

  1. Décide chacun individuellement

Si vous avez besoin de certaines de ces alertes dans vos tests, vous pouvez gérer chaque alerte individuellement en utilisant:

driver.switchTo().alert().accept();

  1. Gestion par défaut de la configuration

Pour gagner du temps, vous pouvez définir chrome capabilites au début de l’exécution du test sur ACCEPTER, INGORE ou IGNORER alertes par défaut quand ils apparaissent.

Exemple:

capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);

  1. Utilisation de la classe Robot

Robot r = nouveau Robot ();

r.keyPress (KeyEvent.VK_ENTER);

r.keyRelease (KeyEvent.VK_ENTER);


  1. Rouvrir une nouvelle session

driver.quit (); 

driver = new ChromeDriver ();


11
cogitovirus

Essaye ça, 

public boolean isAlertPresent() {

    boolean presentFlag = false;

    try {

        // Check the presence of alert
        Alert alert = driver.switchTo().alert();
        // Alert present; set the flag
        presentFlag = true;
        // if present consume the alert
        alert.accept();
        //( Now, click on ok or cancel button )

    } catch (NoAlertPresentException ex) {
        // Alert not present
        ex.printStackTrace();
    }

    return presentFlag;
}

J'espère que cela vous aidera.

3
Chetan

Le plus souvent, ce problème est gênant dans la mesure où il apparaît à des endroits imprévisibles du système testé. À l'heure actuelle, je ne pense pas qu'il existe des moyens de traiter TOUTES ces non-crédités automatiquement par configuration dans le WebDriver. Mon conseil général serait d’envelopper WebDriver dans un proxy et d’utiliser une sorte de proxy dynamique pour envelopper toutes les méthodes de WebDriver. De cette façon, vous obtenez un point de contrôle unique sur des alertes imprévisibles, la journalisation ou l'évaluation des performances des méthodes, la gestion des exceptions aléatoires inaccessibles, la gestion aléatoire des exceptions StaleElementException, etc. .

        Class WebDriverProxy implements InvocationHandler{
       WebDriverWrapperImpl impl = new WebDriverWrapperImpl();

        public String clickByXPath(String xpath)  {
            return (String)handleInvocation(impl,"clickByXPath", new Object[]{xpath});
            //  return impl.clickByXPath( xpath) ;
        }


    /**All fail fast strategies could be centralized here., no need of any assertion errors in libraries,
         * However it makes sense to wrap webdriver exceptions as either recoverable or nonrecoverable
         * recoverable ones are like unexpected hangs on the browser, which could be handled at the test runner level, wherein the 
         * whole test can be retried.
         * irrecoverable ones are also mostly handled at the test runner level, but capable of being caught at the test script level *  
         **/
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            Object o = null;
            Throwable target = null;
            try{
                o = method.invoke(proxy, args);
            }       
            catch(InvocationTargetException ee){            
                target = ee.getTargetException();
                throw target;
            }
            return o;
        }

        public Object handleInvocation(Object proxy, String method, Object[] args){     

            Object toReturn = null;
            Method m = null;
            Class[] classes = new Class[args.length];
            for(int i = 0;i<args.length;i++){
                classes[i]=String.class;
            }
            for(Object x:args){
            logBuffer.append(x.toString()+","); 
            }
            log.trace("WebDriverProxy. "+method+"("+logBuffer.toString()+")");
            logBuffer = new StringBuffer();
            try{
                 m = proxy.getClass().getMethod(method,classes);

                toReturn = invoke(proxy,m, args);

            }catch(NoSuchMethodException e){    
                e.printStackTrace();

            }catch( StaleElementReferenceException e){
                log.debug("Exception was of tye "+e.getClass().getCanonicalName());






            }
            catch(UnreachableBrowserException | NoSuchElementException e){
                log.debug("Exception was of tye "+e.getClass().getCanonicalName());
                //If the NoSuchelement is due to suspect Alerts being present, switchToAlert() and alert.accept() here.
            }



            return toReturn;
        }



        }


class WebDriverWrapperImpl {
 WebDriver driver = new ChromeDriver();
  public String clickByXPath(String xpath)  throws Exception{
            driver.findElement(By.Xpath(xpath)).click();
            return driver.getTitle();
        }

}
1
premganz

Si vous utilisez des infrastructures telles que TestNG, vous pouvez utiliser des programmes d'écoute tels que ITestListener e.t.c, où vous devez remplacer certaines des méthodes telles que BeforeCommand et afterCommand. Donc, dans BeforeCommand, implémentez le code d'alerte pour ignorer et vérifier la beauté. Chaque fois que la commande Selenium est exécutée, cette méthode beforeCommand appelle automatiquement et vérifie si une alerte est présente ou non. Si oui, il écartera et exécutera votre commande. J'espère que cela résoudra notre problème

0
Manidhar