创建了两个 WebDriver 实例
Two instance of WebDriver created
我是 Selenium 的新手,也是 Java。我正在尝试实现 POM-PageFactory 模型。我的 testng 方法正在启动 2 个 WebDriver 实例。
我有一个包含驱动程序对象的 BaseClass 和一个负责根据浏览器调用正确 drive.exe 的 init 方法。 PageClass 是页面对象存储库,具有很少的实用方法。 TestClass 具有测试方法。如果我在 TestClass 中调用 init 方法,我的代码工作正常。但是我打算在 BaseClass 中调用。如果我这样做,则会创建 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();
}
}
创建了 2 个实例,因为您调用了 BaseClass
两次。
你看,当使用 @BeforeClass
注释时,你正在创建一个 PageClass
的实例,它继承自 BaseClass
。由于继承,您正在调用 PageClass
的构造函数和 BaseClass
的默认构造函数。在 @BeforeClass
中创建第一个驱动程序。
然后,在 TestClass
class 中创建了 WebDriver
的第二个实例,因为 TestNG 创建了 TestClass
的实例并再次 - [=17= 的构造函数] 在 BaseClass
.
中调用默认构造函数
这就是为什么你有 2 个 WebDriver
您的 BaseClass
构造函数实例化了 chrome 驱动程序。现在 TestClass
和 PageClass
都扩展了 BaseClass
。当您实例化 PageClass
时,它会调用父构造函数并创建一个 chrome 驱动程序。当您的测试 运行ner 实例化 TestClass
时,它也会执行相同的操作。
这就是为什么您会得到两个 chrome 驱动程序实例的原因。
不要从 BaseClass
扩展 TestClass
,它将 运行 只有一个 chrome 驱动程序。
更好的处理方法是在 @BeforeClass
中实例化 Web 驱动程序。并传递驱动实例化页面类。在 BaseClass
和 PageClass
的构造函数中使用 WebDriver
作为参数。
然后在@AfterClass
中清理网络驱动程序
我是 Selenium 的新手,也是 Java。我正在尝试实现 POM-PageFactory 模型。我的 testng 方法正在启动 2 个 WebDriver 实例。
我有一个包含驱动程序对象的 BaseClass 和一个负责根据浏览器调用正确 drive.exe 的 init 方法。 PageClass 是页面对象存储库,具有很少的实用方法。 TestClass 具有测试方法。如果我在 TestClass 中调用 init 方法,我的代码工作正常。但是我打算在 BaseClass 中调用。如果我这样做,则会创建 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();
}
}
创建了 2 个实例,因为您调用了 BaseClass
两次。
你看,当使用 @BeforeClass
注释时,你正在创建一个 PageClass
的实例,它继承自 BaseClass
。由于继承,您正在调用 PageClass
的构造函数和 BaseClass
的默认构造函数。在 @BeforeClass
中创建第一个驱动程序。
然后,在 TestClass
class 中创建了 WebDriver
的第二个实例,因为 TestNG 创建了 TestClass
的实例并再次 - [=17= 的构造函数] 在 BaseClass
.
这就是为什么你有 2 个 WebDriver
您的 BaseClass
构造函数实例化了 chrome 驱动程序。现在 TestClass
和 PageClass
都扩展了 BaseClass
。当您实例化 PageClass
时,它会调用父构造函数并创建一个 chrome 驱动程序。当您的测试 运行ner 实例化 TestClass
时,它也会执行相同的操作。
这就是为什么您会得到两个 chrome 驱动程序实例的原因。
不要从 BaseClass
扩展 TestClass
,它将 运行 只有一个 chrome 驱动程序。
更好的处理方法是在 @BeforeClass
中实例化 Web 驱动程序。并传递驱动实例化页面类。在 BaseClass
和 PageClass
的构造函数中使用 WebDriver
作为参数。
然后在@AfterClass