2013-10-04 11 views
9

Ich habe ein Problem mit Selen timeout exception wegen eines Pop-up-FensterWie behandelt man die "unerwartete Warnung offen"?

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

Die Warnung hat OK und CANCEL Tasten werfen. Ich kenne zwei Möglichkeiten, dieses


Der erste Weg zu handhaben ist, öffnen Sie eine neue Sitzung

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

Zweiter Weg Robot-Klasse wird mit

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

Doch diese Methoden sind nicht zeiteffizient. Gibt es einen besseren Weg?

Antwort

18

Dies sollte den Trick:

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

Ich habe diese: „NoSuchAlertError: keine Benachrichtigung offen“ ... Es ist nicht konsequent, manchmal sind die Tests bestehen, manchmal gibt es mir, dass Fehler, wenn ich versuche, um die Warnung zu akzeptieren ... keine Ahnung, wie oder warum etwas reparieren? –

+6

Wenn etwas nicht konsequent in WebDriver fehlschlägt, ist es 95% Chance, dass es ein Timing-Problem ist. Sie können 'new WebDriverWait (driver) .until (ExpectedConditions.alertIsPresent())' verwenden, um darauf zu warten. –

+0

Ich benutze Nodejs Selenium, können Sie ein ausführlicheres Beispiel geben? Vielen Dank –

3

die Sie interessieren,

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; 
} 

ich diesen Willen hilfreich hoffen euch.

+0

es ist eine unerwartete Warnung kann es überall wo angezeigt werden. Also denkst du, dass ich nach jeder Codezeile diese boolesche Funktion 'isAlertPresent()' nenne, wenn deine Antwort NEIN ist, dann bearbeite und erkläre, wie diese Funktion optimal aufgerufen wird, ohne jedes Mal zu wiederholen/aufzurufen. – paul

+0

@paul, sollten Sie nach Ihren Bedürfnissen ändern. Ich habe insgesamt nicht für bestimmte Teile geschrieben. – Chetan

+0

stört es Sie teilen, wie Sie in Ihrem Code umgehen? – paul

0

Wenn Sie Frameworks wie TestNG verwenden, können Sie Listener wie ITestListener e.t.c verwenden, wo Sie einige der Methoden wie BeforeCommand und afterCommand überschreiben müssen. So implementieren Sie in BeforeCommand Code für die Warnung, um die Schönheit zu entlassen und zu überprüfen. Wenn jemals der selen-Befehl ausgeführt wird, ruft diese beforeCommand-Methode automatisch auf und prüft, ob eine Warnung vorhanden ist oder nicht. Wenn ja, wird Ihr Befehl abgewiesen und ausgeführt. Ich hoffe, es wird lösen u Problem r

+0

Ich habe in TestNG-Listenern nicht so etwas wie vorCommand gefunden, aber in [this] (https://Stackoverflow.com/a/35692021/3562925) gefunden, dass die Implementierung von 'WebDriverEventListener' möglich ist, was Sie vorgeschlagen haben. – apreg

5

Sie Chrom capabilites zu ACCEPT einstellen, ingore oder DISMISS Warnungen standardmäßig, wenn sie angezeigt werden.

Beispiel:

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

Häufiger dieses Problem lästig ist, dass es zu unvorhersehbaren Stellen im System im Test erscheint. Momentan glaube ich nicht, dass es Wege gibt, ALLE diese Unentschiedenheiten automatisch durch Konfiguration im Webdriver zu behandeln. Mein allgemeiner Rat wäre, den webDriver in einen Proxy zu verpacken und eine Art dynamischen Proxy zu verwenden, um alle Methoden des Webdrivers zu umbrechen. Auf diese Weise erhalten Sie einen zentralen Kontrollpunkt für unvorhersehbare Warnmeldungen, Protokollierung oder Auswertung der Methodenleistung, zufällige, unerreichbare Browser-Ausnahmen, zufällige StaleElementException usw. Ich empfinde dies als sehr nützlich für eine Vielzahl von Situationen, mit einer kleinen Leistungseinbuße .

 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(); 
     } 

} 
Verwandte Themen