已创建两个WebDriver实例

时间:2019-05-09 11:19:48

标签: java selenium selenium-webdriver page-factory

我是Selenium和Java的新手。我正在尝试实现POM-PageFactory模型。我的testng方法是启动两个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 个答案:

答案 0 :(得分:2)

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

这就是为什么要获得两个chrome驱动程序实例的原因。

请勿从TestClass扩展BaseClass,它将仅运行一个chrome驱动程序。


一种更好的处理方法是在@BeforeClass中实例化Web驱动程序。并传递驱动程序以实例化页面类。在WebDriverBaseClass的构造函数中使用PageClass作为参数。

然后在@AfterClass

中清理Web驱动程序

答案 1 :(得分:1)

创建两个实例是因为您两次调用BaseClass

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

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

这就是为什么您有2个BaseClass实例

的原因