2016-02-29 76 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,我不记得以前的讨论,如果发生,任何如何堆栈是非常好的平台获得帮助和我也会尽力而为。 –