我在Selenium测试中使用自定义WebDriverEventListener来进行日志记录和屏幕截图。它工作正常:
例如,当在浏览器窗口中找不到元素时,webdriver会抛出异常并正确触发onException()方法
@Override
public void onException(Throwable throwable, WebDriver driver) {
// do stuff
}
当我自己抛出异常时:throw new WebDriverException("my message");
事件未被触发。
有人可以解释这种行为吗?
答案 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;
}
};
};