我是硒和爪哇的新手。我正在尝试实现POM-PAGEFACTORY模型。我的testng方法是启动2个web驱动器实例。
我有一个基于驱动程序对象的基本镜和一个启动方法,负责基于浏览器调用正确的驱动器。PageClass是几乎没有实用程序方法的页面对象存储库。测试阶层具有测试方法。如果我在testClass中调用INIT方法,则我的代码正常工作。但是,我打算在基本勒索中调用。如果我这样做,则创建2个驱动程序对象实例。请参阅下面的代码
public class BaseClass {
public static WebDriver driver;
public BaseClass() {
init("chrome");
//if init is invoked with in TestClass code is fine
//do not know what to do here if init call is removed
}
public void init(String browser) {
switch(browser) {// instantiate driver based on browser
case "chrome":
driver = new ChromeDriver();
break;
}
}
public void navigate(String url) {
//open website
}
}
public class PageClass extends BaseClass{
@FindBy()
WebElement searchTxtBox;
//other elements here
public PageClass() {
PageFactory.initElements(driver, this);
}
public void enterSearchText(){
//page specific methods
}
}
public class TestClass extends BaseClass {
PageClass page;
public TestClass() {
super();
}
@BeforeClass
public void launch() {
// init("chrome"); .....if init() moved to BaseClass
// then 2 instances of Chrome driver is launched
page = new PageClass();
}
@Test
public void searchForSomething()
{
navigate("https://google.com");
page.enterSearchString("Selenium");
page.clickSearchBtn();
}
}
您的BaseClass
构造函数实例化Chrome驱动程序。现在TestClass
和PageClass
都扩展了BaseClass
。当您实例化PageClass
时,它将调用父构建器并创建Chrome驱动程序。当您的测试跑步者实例化TestClass
时,它也可以执行相同的操作。
这就是为什么您要获得两个Chrome驱动程序的实例。
不要从BaseClass
扩展TestClass
,它将仅运行一个Chrome驱动程序。
处理它的更好方法是在@BeforeClass
中实例化Web驱动程序。并将驱动程序传递给实例化页面类。在BaseClass
和PageClass
的构造函数中使用WebDriver
作为参数。
然后清理@AfterClass
中的Web驱动程序
2个实例,因为您两次调用BaseClass
。
您看到,使用@BeforeClass
注释时,您正在创建一个PageClass
的实例,该实例从BaseClass
继承。由于继承,您将调用PageClass
的构造函数和BaseClass
的默认构造函数。在@BeforeClass
中,您创建第一个驱动程序。
然后,在TestClass
类中,您创建了WebDriver
的第二个实例,因为TestNG创建了TestClass
的实例,然后再次 - TestClass
的构造函数在BaseClass
中调用默认构造函数。
这就是为什么您有2个WebDriver