【问题标题】:Two instance of WebDriver created创建了两个 WebDriver 实例
【发布时间】:2025-12-11 01:25:01
【问题描述】:

我是 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();
  }
}

【问题讨论】:

  • 我打算将创建驱动程序的责任转移到 BaseClass。 TestClass 应该只处理启动 url 和只执行测试
  • 找到它的简单方法是在测试开始时添加一个断点,运行它,然后逐行执行。然后,您将看到第二个浏览器实例何时生成并知道问题出在哪里。

标签: java selenium selenium-webdriver page-factory


【解决方案1】:

您的 BaseClass 构造函数会实例化 chrome 驱动程序。现在TestClassPageClass 都扩展了BaseClass。当您实例化 PageClass 时,它会调用父构造函数并创建一个 chrome 驱动程序。当您的测试运行程序实例化TestClass 时,它也会执行相同的操作。

这就是您获得两个 chrome 驱动程序实例的原因。

不要从BaseClass 扩展TestClass,它只会运行一个chrome 驱动程序。


处理它的更好方法是在@BeforeClass 中实例化网络驱动程序。并通过驱动实例化页面类。在BaseClassPageClass 的构造函数中使用WebDriver 作为参数。

然后清理@AfterClass中的web驱动

【讨论】:

  • 感谢您的解释!!将 BaseClass 扩展到 TestClass 和 PageClass 有什么好处吗?如果不扩展 BaseClass,TestNG 会不会有任何缺点,比如并行执行/硒网格?
  • 接受您的建议-您是说@BeforeClass 方法在BaseClass 中。如果您能提供更多详细信息,那就太好了
【解决方案2】:

创建了 2 个实例,因为您调用了两次 BaseClass

你看,当使用@BeforeClass 注解时,你正在创建一个继承自BaseClassPageClass 的实例。由于继承,您正在调用PageClass 的构造函数和BaseClass 的默认构造函数。在@BeforeClass 中创建第一个驱动程序。

然后,在 TestClass 类中创建 WebDriver 的第二个实例,因为 TestNG 创建了 TestClass 的实例,并且再次 - TestClass 的构造函数调用 BaseClass 中的默认构造函数。

这就是为什么你有 2 个 WebDriver 实例

【讨论】: