2013-10-04 11 views
9

ため、私はポップアップウィンドウのtimeout exceptionを投げるセレンと「予期しないアラートを開く」の処理方法

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

を問題を持ってアラートがOKCANCELボタンがあります。私は最初の方法は、第二の方法は、Robotクラスに

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

を使用している

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

新しいセッションを再開です。この


を処理する2つの方法をしかし、この方法は知っています時間効率的ではありません。もっと良い方法はありますか?

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

私はあなたにこの意志は役に立ち願って、これを試してみてください

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

答えて

18

これはトリックを行う必要があります。

+0

私はこれだ:任意のアイデアなぜか、どのようにそれは...私は警告を受け入れるようにしようとすると、時にはそれは私にそのエラーを与え、時にはテストに合格、一貫していないのです...。「いいえ、アラートオープンNoSuchAlertErrorを」それを修正するには? –

+6

WebDriverで何かが一貫して失敗していない場合は、タイミングの問題である可能性は95%です。あなたは 'new WebDriverWait(driver).until(ExpectedConditions.alertIsPresent())'を使ってそれを待つことができます。 –

+0

Nodejs Seleniumを使用していますが、より詳細な例がありますか?多くのありがとう –

3

+0

に変更されました。だからあなたは、このブール関数 'isAlertPresent()'を呼んだコードのすべての行の後に答えがNOであると思ったら、毎回繰り返されることなくこの関数を最適に呼び出す方法を編集して説明してください。 – paul

+0

@paul、必要に応じて変更する必要があります。私は全体を特定の部分ではなく書きました。 – Chetan

+0

あなたのコードをどうやって扱うか分かりますか? – paul

0

TestNGのようなフレームワークを使用している場合は、BeforeCommandやafterCommandなどのメソッドの一部をオーバーライドする必要があるITestListener e.t.cのようなリスナーを使用できます。したがって、BeforeCommandでは、アラートを解除して美しさをチェックするコードを実装します。セレンコマンドが実行されると、このbeforeCommandメソッドは自動的に呼び出して、アラートが存在するかどうかをチェックします。はいの場合、コマンドを閉じて実行します。私は、彼らが表示された場合の違いを無視またはは、デフォルトでアラートを削除、それはuはあなたがをACCEPT にクロムcapabilitesを設定することができ、問題

+0

TestNGリスナーでBeforeCommandのようなものが見つかりませんでしたが、[this](https://stackoverflow.com/a/35692021/3562925)にあるように、あなたが提案した 'WebDriverEventListener'を実装することで答えが見つかりました。 – apreg

5

rを解決することを願っています。

例:

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

それがテスト中のシステムで予測不可能な場所で表示されるには多くの場合、この問題が面倒です。今は、Webdriverの設定によってこれらのすべての不具合を自動的に処理する方法はないと思います。私の一般的なアドバイスは、WebDriverをProxyでラップし、何らかの動的プロキシを使用してすべてのWebdriverメソッドをラップすることです。このようにして、予期しないアラートを制御する単一のポイントを取得し、ロギングやメソッドパフォーマンスの評価、ランダムなunreachableBrowser例外の処理、ランダムなStaleElementExceptionの処理などを行います。これは、小さなパフォーマンスペナルティ。

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

}