Java 在失败的JUnit测试中使用Selenium WebDriver截图的测试设计

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

我遇到了一个奇怪的JUnit和Selenium问题。 我想写一个截图,可以截图失败的测试

我将截图获取者类定义为:

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也可能有帮助。