当前位置: 首页 > 知识库问答 >
问题:

如何在不使用WebDriver的静态实例的情况下设计Cucumber-Selenium框架?

胡高寒
2023-03-14

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

附加信息:

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

共有1个答案

丁淇
2023-03-14

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

然而,这也意味着在场景之间共享状态。这意味着您必须在每个场景之前清理Web驱动程序。场景之间的任何状态共享都将阻止您并行运行场景。

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

<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

 类似资料:
  • 我正在尝试将ChromeOptions传递给我的驱动程序以允许弹出窗口。我将TestNG与@BeforeClass、@Test和@AfterClass注释一起使用。。我正在尝试启用弹出窗口,并且使用以下方法成功地实现了这一点。 虽然这确实有效,但它会打开webdriver,然后打开另一个带有选项的驱动程序。我不希望出现两个Web驱动程序。。我只想把这些选项传递给第一个webdriver!我使用一个

  • 我有一门课: 问题是,只有我实例化了那个类,它才会运行。 不管怎样,我怎么能强迫它运行呢?

  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul

  • 我确实尝试了像chrome操作这样的选项,但似乎什么都不起作用。如果有人知道如何解决这个问题,就需要一些指导。

  • 如下面的代码所示,我可以调用非静态成员函数 ,而无需实例化该类的对象。仅当函数未绑定到任何其他成员时,这才有可能。例如,我不能以类似的方式调用。 在我看来,如下代码所示的调用的行为就像调用静态成员函数。这样的结论正确吗?这种行为如何证明是正当的?

  • 问题内容: 用例:使用用户名登录,导航到第二因素认证页面以执行多项操作(即回答基于知识的问题),然后导航至最后一页以输入密码。关闭浏览器,然后尝试使用用户名再次登录。这次绕过了第二因素身份验证页面,因为该应用程序识别出cookie,并提示用户直接输入密码。 问题:我正在使用Selenium RemoteWebDriver在单独的测试计算机上运行这些测试,并且当我关闭第一个浏览器并打开一个新的Rem

  • 在我的情况下,登录应用程序时需要通过UID从realTime Database获取用户配置文件 在文档中必须使用添加值事件通知程序才能从实时数据库读取 //如果我有obj的id,如何直接从实时firebase获取值 //我的问题是,这里不能使用这种方法

  • 我已经尝试通过使用getter和setter来更改下面变量x的值。