一尘不染

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

selenium

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

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

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

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

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

预先感谢您的帮助!


阅读 299

收藏
2020-06-26

共1个答案

一尘不染

我建议您将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();
   }
}

希望能帮助到你。

2020-06-26