我们可以使用静态变量来初始化selenium webdriver中的驱动程序

时间:2014-05-19 10:51:36

标签: java selenium webdriver

我们有一个静态变量来初始化Selenium WebDriver中的驱动程序。

public static WebDriver driver;

此变量在类(DriverInit)中声明,并在各种测试计划(测试类)的“@BeforeClass”中初始化。初始化变量(驱动程序)将在整个项目中以各种可重用函数和@test方法使用。驱动程序将在@QAfterClass

关闭/退出

这适用于非平行执行脚本。有一个静态变量来初始化驱动程序会影响并行执行吗?

例如:

public class DriverInit { (using remote webdriver, browser name will be read from XML)
  public static WebDriver driver;    
  public DriverInit() {
    switch (browser) {
    case "IE" : driver = ....
    case "Firefox" : driver = ....
    }
  }
}

public class TestClass {
  @BeforeClass
  public void BeforeClass() {
   DriverInit driver = new DriverInit();
  }

  @Test
  public void Test1() {
   DriverInit.driver.findElementBy();
   Reusable.func1();
  }
}

Public class Reusable {

  public WebElement r1;
  public Reusable() {
    r1 = DriverInit.driver.findElementBy(..);
  }
  public void func1() {
     r1.findElementBy(..);
  }
}

4 个答案:

答案 0 :(得分:1)

将静态用于驱动程序实例是不正确的。 最好创建get_method以将驱动程序返回到另一个类。

public class DriverInit { (using remote webdriver, browser name will be read from XML)
private WebDriver driver;

public WebDriver getDriver() {
switch (browser) {
case "IE" : driver = ....
case "Firefox" : driver = ....
return driver;
}
}

public class TestClass {
private Webdriver driver;
@BeforeClass
public void BeforeClass() {
DriverInit driveInit= new DriverInit();
driver=driveInit.getDriver();
}

@Test
public void Test1() {
Reusable reusable = new Reusable();
reusable.func1Click(driver);
}
}

public class Reusable {

public void func1Click(WebDriver driver) {
driver.findElementBy(..).click();
}
}

答案 1 :(得分:1)

正如您所说,您可以使用静态驱动程序,但是,如果您直接在测试代码级别进行任何并行化,则可能会遇到共享内存问题。

我出于这个原因避免使用静态驱动程序,这对于可能会成为并行化的测试套件来说是糟糕的设计。在selenium网格中的多个服务器上运行单个进程启动测试是行不通的。

我围绕这种情况设计的方法是在初始化时将驱动程序(在@Before中创建)传递给每个页面对象。

如果套件不会增长,您仍然可以使用静态驱动程序,并将多个测试作为单独的作业启动(即单独的Jenkins作业,或从命令行单独运行等)

答案 2 :(得分:0)

当您将字段定义为static时,每个线程都可以访问它,并且每个线程都可以修改该内存空间。这就是为什么我怀疑使用定义为static的webdriver实例的可能性。但您可以考虑使用Selenium Grid来跨不同浏览器运行多个测试。

答案 3 :(得分:0)

使用Singleton类定义webDriver, 然后在其他类中使用相同的实例