什么时候在WebDriverEventListener中触发onException?

时间:2014-01-08 12:30:33

标签: java events exception selenium selenium-webdriver

我在Selenium测试中使用自定义WebDriverEventListener来进行日志记录和屏幕截图。它工作正常:

例如,当在浏览器窗口中找不到元素时,webdriver会抛出异常并正确触发onException()方法

@Override
public void onException(Throwable throwable, WebDriver driver) {
    // do stuff
}

当我自己抛出异常时:throw new WebDriverException("my message");事件未被触发。

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:1)

如果您想在测试失败或某些异常时执行某些操作,可以在测试中添加一条规则(在类中添加@Before setUp()):

@Rule
public TestRule testWatcher = new TestWatcher() {

    @Override
    public void succeeded(Description test){
        for (LogEntry log : driver.manage().logs().get(LogType.DRIVER).getAll()) {
            System.out.println("Level:" + log.getLevel().getName());
            System.out.println("Message:" + log.getMessage());
            System.out.println("Time:" + log.getTimestamp());
            System.out.println("-----------------------------------------------");
        }
        System.out.println();

    @Override
    public void failed(Throwable t, Description test) {

        String testName = test.getClassName();
        String subTestName = test.getMethodName();
        String screenShotName = String.format("%s\\%s", testName, screenShotName);
        if (driver instanceof TakesScreenshot) {
          File tempFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
          try {
              System.out.println(">>>>>>>>>>LOGS: " + yourDirForImages + "\\" + screenShotName + ".png");
              FileUtils.copyFile(tempFile, new File(String.format("%s.png", screenShotName)));
          } catch (IOException e) {
            e.printStackTrace();
          }
    }

}

侦听器可以在触发某些操作时用于执行某些代码,如果有标题,徽标或页脚,则可以使用前导。

public class ListenerMethodsImplementation extends AbstractWebDriverEventListener {

    public void beforeClickOn(WebElement element, WebDriver myTestDriver) {
    assertTrue("No Logo!", myTestDriver.findElements(By.id("logo")) == 1);
}

如何使用它:

    @Before
    public void setUp() {
        EventFiringWebDriver myTestDriver = new EventFiringWebDriver(driver);
        ListenerMethodsImplementation myListener = new ListenerMethodsImplementation();
        myTestDriver.register(myListener);
        driver = myTestDriver;
    }

如何从侦听器获取驱动程序:((EventFiringWebDriver) driver).getWrappedDriver()

PS它只是我代码中的一小部分,但我认为这会对你有帮助。

答案 1 :(得分:0)

现在我明白了,因为侦听器只注册到WebDriver itelf,它不会在WebDriver外部处理异常。

在抽象测试案例中,我在Andrian Durlestean的建议中执行了以下操作。

eventListener = new CustomWebDriverEventListener();
driver = new EventFiringWebDriver(driver).register(eventListener);

@Rule
public TestWatcher  watchman = new TestWatcher() {

    protected void failed(Throwable e, Description description) {
        RuntimeException exception = (RuntimeException) e;
        eventListener.onException(e, getDriver());
        if (exception instanceof RuntimeException) {
            throw exception;
        }   
    };
};