2016-02-29 86 views
1

我工作的應用程序會引發大量意外警報。 我想實現一種方法,通過一個常見的方法來捕獲所有這些isAlert的存在。如何編寫將在每個步驟執行後執行的代碼

但是,如何調用webDrriver中的每一步isAlertpresnt,任何人都可以幫助我嗎?

通常我的方法是這樣的: -

public void checkAlert() { 
    try { 
     WebDriverWait wait = new WebDriverWait(driver, 2); 
     wait.until(ExpectedConditions.alertIsPresent()); 
     Alert alert = driver.switchTo().alert(); 
     alert.accept(); 
    } catch (Exception e) { 
     //exception handling 
    } 
} 

的問題是如何在每一個步驟之前打電話了嗎?我知道這會讓我的代碼變慢,但是很想讓它實現。

我正在尋找在我的測試中的每個命令\步驟之後執行的操作。這可能嗎?

目前我在嘗試捕獲所有預期的情況下調用此方法。

+0

你使用任何測試框架,例如'junit'或'testng'運行測試?你可以看看可用的'註釋'。 – Rao

+0

我正在使用TestNG框架。但我看不到任何匹配的註釋在每個命令後執行 – Sapna

回答

2

WebDriver有WebDriverEventListener監聽器,您正在嘗試執行的操作。通過實現此偵聽器並註冊驅動程序 - 您可以在使用webdriver執行的每個操作之前/之後獲取此幕後調用checkAlert方法。

看看這個例子。

http://toolsqa.com/selenium-webdriver/event-listener/

+0

這是好東西。 –

0
I could think of a solution using a Thread, which always monitors if there is any alert present, if yes then accept else don't do any thing. Considering you are using a testNG or Junit framework, here is the sample: 


package poc.grid; 
import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.By; 
import org.openqa.selenium.NoAlertPresentException; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.AfterTest; 
import org.testng.annotations.BeforeTest; 

public class Test { 

    static WebDriver driver; 

//This method returns a Thread, which monitors any alert and accept whenever finds it. And this return a Thread object. 
public static Thread handleAlert(final WebDriver driver) 
    { 
     Thread thread = new Thread(new Runnable() { 
      public void run() { 
       while(true) 
       { 
        try 
        { 
         System.out.println("Checking alert .... "); 
         driver.switchTo().alert().accept(); 
         System.out.println("Alert Accepted. "); 
        }catch(NoAlertPresentException n){ 
         System.out.println("No Alert Present. "); 
        }catch (Exception e) { 
         System.out.println("Exception: "+e.getMessage()); 
        } 
       } 
      } 
     }); 

     return thread; 
    } 

    @BeforeTest 
    public void beforeTest() 
    { 
     driver = new FirefoxDriver(); 
     driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

     //In before Test, just call Thread and start it. 
     handleAlert(driver).start(); 
    } 

    //This is your normal Test 
    @org.testng.annotations.Test 
    public static void test() 
    { 
     try 
     { 
      driver.get("https://payments.billdesk.com/pb/"); 

      int i=0; 
      while(i<=10) 
      { 
       driver.findElement(By.xpath("//button[@id='go']")).click(); 
       Thread.sleep(2000); 

       i++; 
      } 
     }catch(Exception e) 
     { 
      System.out.println("Exception: "+e.getMessage()); 
     } 
    } 

    //At the end of test, you can stop the Thread. 
    @AfterTest 
    public void afterTest() 
    { 
     handleAlert(driver).stop(); 
    } 

} 
1

已有一個很好的答案提供了通過使用事件偵聽器。

另一個簡單的方法來處理,如果你正在使用所有硒動作的關鍵字/方法。我想說的是,如果您使用像click(「locator」)方法在您的測試用例中執行單擊操作而不是一次又一次編寫驅動程序命令,則可以在單擊該方法後單擊該警報交叉檢查命令。

public void myClick(String myxpath){ 

    driver.findElement(By.xpath(myxpath)).click(); 
    //calling checkAlert method to cross check 
} 

因此,如果您使用的是像點擊,硒動作輸入等方法,那麼你可以嘗試像上面。

謝謝你, 穆拉利

+0

感謝Murali,我會在我的下一個框架中嘗試這一點。我認爲我們之前已經就硒培訓發言:) – Sapna

+0

hoo..sorry,我不記得以前的討論,如果發生,任何如何堆棧是非常好的平臺獲得幫助和我也會盡力而爲。 –