如何编写将在执行每个步骤后执行的代码

时间:2016-02-29 03:42:26

标签: java selenium frameworks webdriver alerts

我工作的应用程序会发出很多意外警报。 我想通过一个常见的方法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
    }
}

问题是如何在每一步之前调用它?我知道这会使我的代码变慢但很难实现。

我正在寻找在我的测试中每个命令\步之后执行的东西。这可能吗?

目前我正在使用try catch在所有预期的场景中调用此方法。

3 个答案:

答案 0 :(得分:2)

WebDriver有WebDriverEventListener监听器,您正在尝试做的事情。通过实现此侦听器并注册驱动程序 - 您可以在使用webdriver执行的每个操作之前/之后,在幕后调用此checkAlert方法。

看看这个例子。

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

答案 1 :(得分:1)

通过使用事件监听器,已经提供了一个很好的答案。

另一种简单的处理方法,如果您使用关键字/方法进行所有selenium操作。我想说的是,如果你使用click(“locator”)方法在你的测试用例中执行click而不是一次又一次地编写驱动程序命令,那么你可以在点击该click方法后插入那个alert cross checking命令。

 public void myClick(String myxpath){

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

所以,如果您使用点击,输入等方法进行硒动作,那么您可以尝试上述方法。

谢谢你, 穆拉利

答案 2 :(得分: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();
    }

}