编程语言
首页 > 编程语言> > java – 在步骤定义文件之间共享相同的selenium WebDriver

java – 在步骤定义文件之间共享相同的selenium WebDriver

作者:互联网

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

为了说明为什么有多个驱动程序对我们来说是一个问题,想象一个功能文件定义了两个步骤:一个导航​​到一个页面,另一个断言在该页面上出现一行.如果两个步骤碰巧在单独的文件中定义,则第一步定义将使用其驱动程序导航到该页面.到第二步定义运行针对其驱动程序的断言时,它还没有导航到页面(因为这些操作转到另一个驱动程序)并且测试失败.

我们尝试实现每个步骤定义文件将扩展的基类(包含驱动程序).事实证明,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();
   }
}

希望能帮助到你.

标签:cucumber-jvm,java,spring,selenium
来源: https://codeday.me/bug/20190722/1504447.html