当前位置: 首页 > 面试题库 >

在步骤定义文件之间共享相同的Selenium WebDriver

姚洲
2023-03-14
问题内容

现在,我们正在努力采用Cucumber在Java8 /
Spring应用程序上运行功能测试。我们希望步骤定义文件尽可能保持DRY状态,并计划在不同的特征文件中使用相同的步骤定义。由于我们使用seleniumWebDriver来驱动测试,因此我们需要在步骤定义之间共享相同的驱动程序。

为了说明为什么拥有多个驱动程序对我们来说是个问题,请想象一个功能文件,该功能文件定义了两个步骤:一个浏览到页面,另一个声明在该页面上出现一行。如果两个步骤都恰好在单独的文件中定义,则第一步定义将使用其驱动程序导航到页面。到第二步定义针对其驱动程序运行断言时,它尚未导航至页面(因为这些操作已移至另一个驱动程序),并且测试失败。

我们尝试实现每个步骤定义文件都将扩展的基类(包含驱动程序)。事实证明,Cucumber实例化每个步骤定义类的实例,因此,我们最终得到每个步骤定义具有不同的WebDriver实例。

我们曾考虑过使用Spring WebDriver在每个步骤定义文件中注入一个实例,但是我相信这会导致上述相同的问题。

我知道可以使用单例模式来实现这一目标,但是我们的模式似乎是一个常见的问题,单例模式感觉像是过大了。这实际上是正确的方法吗?还是我缺少真正明显的东西?

预先感谢您的帮助!


问题答案:

我建议您将pico-container用作要与一起使用的依赖项注入框架cucumber-jvm

使用PicoContainer,您可以使用WebDriver实例创建一个“基”类,然后将该基类自动地传递给任何其他类。或者,如果您愿意,甚至可以直接通过Web驱动程序。

<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>1.2.3</version>
    <scope>test</scope>
</dependency>

例:

具有WebDriver实例的基类:

public class ContextSteps {

   private static boolean initialized = false;

   private WebDriver driver;

   @Before
   public void setUp() throws Exception {
      if (!initialized) {
         // initialize the driver
         driver = = new FirefoxDriver();

         initialized = true;
      }
   }

   public WebDriver getDriver() {
      return driver;
   }
}

其他通过pico-container DI访问webDriver的类。

public class OtherClassSteps {

   private ContextSteps contextSteps;

   // PicoContainer injects class ContextSteps
   public OtherClassSteps (ContextSteps contextSteps) {
      this.contextSteps = contextSteps;
   }


   @Given("^Foo step$")
   public void fooStep() throws Throwable {
      // Access WebDriver instance
      WebDriver driver = contextSteps.getDriver();
   }
}

希望能帮助到你。



 类似资料:
  • 我需要使用BEHAT在不同类的步骤之间共享数据。类似于(在cucumber-jvm步骤之间传递变量的良好实践)PicoContainer for cucumber。有这样的框架吗?我知道我可以使用静态成员,但可能是一些框架。

  • 我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。 我使用了以下代码。 但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。 } 问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中

  • 是否可以在分支之间共享步骤并仍然运行分支特定的步骤?例如,开发和发布分支具有相同的构建过程,但上传到单独的S3存储桶。 我看到了这篇文章(Bitbucket Pipelines-多个分支具有相同的步骤),但它的步骤是相同的。

  • 本文向大家介绍ASP.NET访问共享文件夹的详细步骤,包括了ASP.NET访问共享文件夹的详细步骤的使用技巧和注意事项,需要的朋友参考一下 假设找找看的ASP.NET程序在A服务器,索引文件在B服务器的ZzkIndex共享文件夹中,访问地址是\\192.168.18.18\ZzkIndex\。要实现就是在A服务器的ASP.NET程序中能读写共享文件夹\\192.168.18.18\ZzkIndex

  • null 在列出的3个选项中,只有最后一个可以使用projectile(可能还有其他Emacs包)。但我需要能够访问/修改文件从Windows以及,所以这不是一个可行的选择。 有没有人为此找到好的解决方案?

  • 我正在思考架构组件/MVVM。 假设我有一个存储库、一个ViewModel和一个片段。我使用类作为包装器来公开网络状态,就像体系结构组件指南中建议的那样。 我的存储库目前看起来是这样的(为简洁起见进行了简化): 然后在ViewModel中,我还声明了一个可变LiveData: 最后,片段: 正如您所看到的,由于LiveData变量将在过程中重置(存储库将创建一个新实例),因此不会触发观察者会出现问