我们有一个静态变量来初始化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(..);
}
}
答案 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, 然后在其他类中使用相同的实例