gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:13 25 4
gpt4 key购买 nike

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

如果每个测试类都来自 BeforeClass 并在 BeforeClass 中固有,那么它应该位于基本测试类中,请对其进行初始化。或者也许网络驱动程序应该是一个单例对象。或者我应该使用 JUnit 规则。我的愿望是我希望能够通过属性文件在多个浏览器上执行测试套件。它不一定必须在多个线程上运行(即 Selenium Grid),但我确实希望能够按顺序运行。例如,如果在属性文件中,我将 IE 和 chrome 设置为 true,它将运行 IE 的测试用例,然后是 chrome。所以,我想知道促进这一点的最佳方法。它还将通过 Excel 文件和 junit 参数化测试进行数据驱动。

谢谢

最佳答案

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

Cucumber-JVM 的一个优点是编写在任何测试之前或之后运行的钩子(Hook)非常容易。否则,您将需要在每次测试之前重置 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);
}
}

关于java - 初始化 Web 驱动程序的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com