Java 初始化Web驱动程序的最佳方法

Java 初始化Web驱动程序的最佳方法,java,junit,selenium-webdriver,Java,Junit,Selenium Webdriver,我目前正在开发一个自动化框架,我想问一个问题。初始化web驱动程序的最佳方法是什么 如果每个测试类都将从BeforeClass中固有并在BeforeClass中固有,则初始化它。或者web驱动程序应该是单例对象。或者我应该使用JUnit规则。我希望能够通过一个属性文件在多个浏览器上执行测试套件。它不一定要在多个线程上运行,即Selenium网格,但我确实希望能够按顺序运行。例如,如果在属性文件中,我将IE和chrome设置为true,它将运行IE的测试用例,然后是chrome。因此,我想知道促进

我目前正在开发一个自动化框架,我想问一个问题。初始化web驱动程序的最佳方法是什么

如果每个测试类都将从BeforeClass中固有并在BeforeClass中固有,则初始化它。或者web驱动程序应该是单例对象。或者我应该使用JUnit规则。我希望能够通过一个属性文件在多个浏览器上执行测试套件。它不一定要在多个线程上运行,即Selenium网格,但我确实希望能够按顺序运行。例如,如果在属性文件中,我将IE和chrome设置为true,它将运行IE的测试用例,然后是chrome。因此,我想知道促进这一进程的最佳方式。它还将通过Excel文件和junit参数化测试进行数据驱动


谢谢

我们用JUnit和Cucumber JVM做了类似的事情。我们对WebDriver实例使用了单例。创建的特定实例基于系统属性。为了在多个浏览器上运行,我们使用浏览器类型的不同系统属性分别运行套件。我们在构建工具中对此进行管理

Cucumber JVM的一个优点是,编写在任何测试之前或之后运行的挂钩非常容易。否则,您将需要在每次测试之前重置WebDriver状态的某些部分

不久前,在一个不相关的案例中,我编写了一个定制的测试运行程序,通过扩展ParentRunner和BlockJUnit4ClassRunner对多个数据库系统运行测试。在构建工具中编写同一套件的多个运行脚本更容易

我在一家商店贴了张快速通行证。我还将在下面发布代码。在准备和清除WebDriver实例方面可能需要一些改进,但这应该是一个很好的起点

此类在填充WebDriver字段后运行单个测试类

public class SingleWebDriverTestRunner extends BlockJUnit4ClassRunner {
private final WebDriver webDriver;

public SingleWebDriverTestRunner(Class<?> klass, WebDriver webDriver) throws InitializationError {
    super(klass);
    this.webDriver = webDriver;
}

// Test Description methods
@Override
protected String getName() {
    return super.getName() + " on " + driverName();
}

private String driverName() {
    return webDriver.getClass().getSimpleName();
}

@Override
protected String testName(FrameworkMethod method) {
    return super.testName(method) + " on " + driverName();
}

@Override
protected Object createTest() throws Exception {
    Object o = super.createTest();

    for (Field f: o.getClass().getDeclaredFields()) {
        if (f.getType().isAssignableFrom(WebDriver.class)) {
            f.setAccessible(true);
            f.set(o, webDriver);
        }
    }

    return o;
}
}
这个类迭代多个WebDriver,创建前一个类的实例

public class MultiWebDriverTestRunner extends ParentRunner<Runner> {
private List<WebDriver> drivers = new ArrayList<WebDriver>(
        Arrays.asList(new FirefoxDriver(), new ChromeDriver())
);

public MultiWebDriverTestRunner(Class<?> klass) throws InitializationError {
    super(klass);
}

@Override
protected Description describeChild(Runner child) {
    return child.getDescription();
}

private List<Runner> children = null;
@Override
protected List<Runner> getChildren() {
    if (children == null) {
        children = getChildrenNew();
    }

    return children;
}

protected List<Runner> getChildrenNew() {
    List<Runner> runners = new ArrayList<Runner>();

    for (WebDriver driver: drivers) {
        try {
            Class<?> javaClass = getTestClass().getJavaClass();
            runners.add(new SingleWebDriverTestRunner(javaClass, driver));
        } catch (InitializationError e) {
            e.printStackTrace();
        }
    }

    return runners;
}

@Override
protected void runChild(Runner child, RunNotifier notifier) {
    child.run(notifier);
}
}

我建议您使用testNG而不是JUNIT。您可以从我们想要使用TestNG的配置文件中传递参数进行测试,但架构拒绝了,因为我们已经在使用JUnit。我更喜欢TestNG。因此,我们可能会使用JUnit4的参数化特性。只需手动解析文件。嘿,Seth,我非常有兴趣看到您编写的这个定制runner的改编版本。谢谢