【问题标题】:How to design a Cucumber-Selenium framework without using Static instances of the WebDriver?如何在不使用 WebDriver 的静态实例的情况下设计 Cucumber-Selenium 框架?
【发布时间】:2021-05-27 14:47:24
【问题描述】:

我正在使用 Cucumber+Selenium 框架测试一个 Web 应用程序。目前,我正在使用 webdriver 类的静态实例来在所有页面/钩子类中使用相同的驱动程序实例。但我知道使用驱动程序对象的静态实例不是一个好习惯。所以我的问题是如何在不使用驱动程序的静态实例的情况下实现良好的框架设计。非常感谢您的帮助。

附加信息:

  1. 我正在使用 Cucumber+Selenium。
  2. 我有一个 Base 类,我在其中实例化了 WebDriver 对象。
  3. 我所有的页面类和钩子/背景类都在扩展 Base 类。

【问题讨论】:

  • 是否基于页面对象模型?设计模式?
  • 是的,它也是基于页面对象模型的。

标签: java selenium cucumber


【解决方案1】:

您正在寻找一种在步骤之间共享状态的方法。并且使用 webdriver 的单个静态实例不一定是一个坏方法。

但这也意味着您在场景之间共享状态。这意味着您必须在每个场景之前清理 webdriver。场景之间的任何状态共享都会阻止您并行运行场景。

要在步骤之间共享状态,而不是在场景之间共享它,您可以使用依赖注入。例如cucumber-picocontainer

<dependencies>
  [...]
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-picocontainer</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
  [...]
</dependencies>

Cucumber 然后可以将步骤定义与其他对象一起注入。但是因为WebDriver 是一个接口,所以您必须定义一个没有构造函数的类才能用作 Web 驱动程序。

public class LazyWebDriver implements Webdriver, Disposable {

    private final Webdriver delegate;

    private Webdriver getDelegate() {
        if (delegate == null) {
            delegate = // create webdriver here
        } 
        return webdriver;
    }

    @Override
    public void dispose() {
        if (webDriver == null) {
            return;
        }
        // Stop webdriver here
    }


    @Override
    public void someDelegatedMethod() {
        getDelegate().doSomeThing();
    }

    // more delegated methods here
   
   ...
}

然后您可以将惰性网络驱动程序注入到您的步骤中:

public class SomeStepDefinitions {

    private final WebDriver webDriver;

    SomeStepDefinitions(LazyWebDriver webDriver) {
        this.webDriver = webDriver;
    }

    // step definitions here
}
public class SomeOtherStepDefinitions {

    private final WebDriver webDriver;

    SomeOtherStepDefinitions(LazyWebDriver webDriver) {
        this.webDriver = webDriver;
    }

    // step definitions here
}

请注意,Disposable 添加了 dispose 方法,可让您在每个场景之后清理驱动程序。

http://picocontainer.com/lifecycle.html

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多