Два экземпляра WebDriver созданы - PullRequest
1 голос
/ 09 мая 2019

Я новичок в Selenium, а также в Java.Я пытаюсь реализовать модель POM-PageFactory.Мой метод testng запускает 2 экземпляра WebDriver.

У меня есть BaseClass, который содержит объект драйвера, и метод init, отвечающий за вызов правильного drive.exe на основе браузера.PageClass - это хранилище объектов страницы с несколькими вспомогательными методами.TestClass имеет методы испытаний.Если я вызываю метод init в TestClass, мой код работает нормально.Однако я намерен вызывать внутри 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 ]

2 голосов
/ 09 мая 2019

Ваш BaseClass конструктор создает драйвер chrome. Теперь и TestClass, и PageClass расширяют BaseClass. Когда вы создаете экземпляр PageClass, он вызывает родительский конструктор и создает драйвер Chrome. То же самое происходит и тогда, когда ваш тестовый участник создает экземпляр TestClass.

Вот почему вы получаете два экземпляра Chrome Driver.

Не расширяйте TestClass с BaseClass, и он будет работать только с одним драйвером Chrome.


Лучший способ справиться с этим - создать экземпляр веб-драйвера в @BeforeClass. И передать драйвер для создания экземпляров классов страниц. Используйте WebDriver в качестве параметра в конструкторе BaseClass и PageClass.

Затем очистите веб-драйвер в @AfterClass

1 голос
/ 09 мая 2019

2 экземпляра созданы, потому что вы вызываете BaseClass дважды.

Видите ли, при использовании аннотации @BeforeClass вы создаете экземпляр PageClass, который наследуется от BaseClass. Из-за наследования вы вызываете конструктор PageClass и конструктор по умолчанию BaseClass. В @BeforeClass вы создаете первый драйвер.

Затем в классе TestClass вы создаете второй экземпляр WebDriver, потому что TestNG создает экземпляр TestClass, и снова - конструктор TestClass вызывает конструктор по умолчанию в BaseClass.

Вот почему у вас есть 2 экземпляра WebDriver

...