我目前正在开发自动化框架,并想提出一个问题。初始化Web驱动程序的最佳方法是什么?
如果它在基础测试类中,每个测试类都将在BeforeClass中固有,则初始化它。或者也许Web驱动程序应该是单例对象。或者我应该使用JUnit规则。我希望能够通过属性文件在多个浏览器上执行测试套件。它不一定必须在多个线程上运行(即Selenium Grid),但我确实希望能够按顺序运行。因此,例如,如果在属性文件中,我将IE和chrome设置为true,它将运行IE的测试用例,然后运行chrome。所以,我想知道促进这一点的最佳方法。它也将通过Excel文件和junit参数化测试进行数据驱动。
谢谢
答案 0 :(得分:0)
我们使用JUnit和Cucumber-JVM做了类似的事情。我们为WebDriver实例使用了单例。创建的特定实例基于系统属性。要针对多个浏览器运行,我们使用浏览器类型的不同系统属性执行Suite的单独运行。我们在构建工具中管理它。
Cucumber-JVM的一个优点是可以很容易地编写在任何测试之前或之后运行的钩子。没有它,您将需要在每次测试之前重置WebDriver状态的某些部分。
不久前,在一个不相关的案例中,我编写了一个自定义测试运行器,通过扩展ParentRunner和BlockJUnit4ClassRunner来对多个数据库系统运行测试。在构建工具中编写同一套件的多个运行脚本更容易。
我在https://github.com/sethkraut/multiwebdriver发了一个快速通行证。我还会在下面发布代码。它可能需要在准备和清除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;
}
}
此类迭代多个WebDrivers创建上一个类的实例
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);
}
}