Java 在失败的JUnit测试中使用Selenium WebDriver截图的测试设计
我遇到了一个奇怪的JUnit和Selenium问题。 我想写一个截图,可以截图失败的测试 我将截图获取者类定义为:Java 在失败的JUnit测试中使用Selenium WebDriver截图的测试设计,java,selenium-webdriver,screenshot,junit4,Java,Selenium Webdriver,Screenshot,Junit4,我遇到了一个奇怪的JUnit和Selenium问题。 我想写一个截图,可以截图失败的测试 我将截图获取者类定义为: public class SeleniumJUnitScreenshotTaker implements MethodRule { private WebDriver driverLocal; public SeleniumJUnitScreenshotTaker(WebDriver driver) { driverLocal = driver; } public
public class SeleniumJUnitScreenshotTaker implements MethodRule
{
private WebDriver driverLocal;
public SeleniumJUnitScreenshotTaker(WebDriver driver)
{
driverLocal = driver;
}
public void takeScreenshot(String fileName)
{
try
{
new File("test-results/scrshots/").mkdirs(); // Make sure directory is there
FileOutputStream out = new FileOutputStream("test-results/scrshots/" + fileName + ".png");
out.write(((TakesScreenshot) driverLocal).getScreenshotAs(OutputType.BYTES));
out.close();
}
catch (Exception e)
{
// No need to crash the tests here
}
}
public Statement apply(final Statement statement, final FrameworkMethod frameworkMethod, final Object o)
{
return new Statement()
{
@Override
public void evaluate() throws Throwable
{
try
{
statement.evaluate();
}
catch (Throwable t)
{
takeScreenshot(frameworkMethod.getName());
throw t; // rethrow
}
}
};
}
我有一个基本测试类,我在其中设置WebDriver,如下所示:
public class TestBase
{
protected static WebDriver driver;
@Rule
public SeleniumJUnitScreenshotTaker seleniumJUnitScreenshotTaker = new SeleniumJUnitScreenshotTaker(driver);
.
.
.
@BeforeClass
public static void intialize()
{
.
.
driver = SeleniumWebDriverFactory.getWebDriver(browser.toString());
if ((browser != Browser.Chrome) && (browser != Browser.ChromeCanary))
{
driver.manage().window().maximize();
}
hostUrl = Configuration.getHostUrl(envUnderTest);
// Open Browser and navigate to main page
driver.navigate().to(hostUrl);
}
@Before
protected void setup() throws Exception
{
this.users = getUsers();
}
@After
protected void teardown()
{
this.testCases.cleanupChecks();
}
@AfterClass
public static void terminate()
{
// Shut down WebDriver
if (driver != null)
driver.quit();
SeleniumWebDriverFactory.stopDriverService();
}
}
问题是,当我尝试在从TestBase派生的测试类中运行一系列测试时,第一次失败后的测试会抛出TimeoutException。这是因为我们不会在测试之间关闭当前浏览器,新测试会尝试查找当前浏览器中缺少的内容。
是否有办法在测试之间关闭浏览器,但不关闭驱动程序?或者在测试之间重新测试驾驶员?还有一种替代设计可以让这一切顺利进行吗
谢谢
Yana在不了解选择此设计的方式或原因的情况下,每次调用测试方法时重新分配驱动程序并不那么困难-您只需在@Before-annotated-setup方法中执行此操作。@After-annotated-teardown方法中的a也可能有帮助。