Объектная модель страницы не расширяет драйвер из класса

Базовый класс:

protected WebDriver driver;
protected String URL = "https://www.example.com/";
public static String SignupURL = "https://www.example.com/login";
public Login loginpage;

@BeforeClass
public void setup()
{

    System.setProperty("webdriver.chrome.driver","E:\\Selenium-Webdriver\\Chrome_Driver\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.navigate().to(URL);
    loginpage = PageFactory.initElements(driver,Login.class);

}

Класс входа:

protected WebDriver driver;

public Login(WebDriver driver) {
    this.driver = driver;}

public Login Method1()
{

    //Logic

}

Класс LoginTest:

  public class LoginTest extends Base {

  @Test
 public void method1()
 {
        setup() //Have to Call it
       //Logic

  }

 @Test 
 public void method2
 {   
     setup() //Have to Call it 
     //Logic
  }

}

Вопрос: Почему требуется вызывать метод setup() для каждого метода в тестовом классе.

Я уже расширяю класс, тогда драйвер должен вызываться автоматически, но это не так. Когда я не вызываю setup(), получаю Nullpointer Exception. Если я его вызываю, система открывает новый браузер для каждого метода.


person Helping Hands    schedule 10.05.2016    source источник
comment
не могли бы вы вставить полное сообщение об ошибке, которое вы получаете. Я думаю, это потому, что скрипт не может идентифицировать драйвер.   -  person k.s. Karthik    schedule 10.05.2016
comment
На первый взгляд код выглядит нормально. Вам не нужно вызывать настройку в каждом методе, можете ли вы поделиться своим журналом трассировки, может быть, он генерирует нулевой указатель какой-то другой фрагмент кода,   -  person Sadik Ali    schedule 10.05.2016
comment
Используйте аннотацию @BeforeTest и сделайте веб-драйвер общедоступным... это работает для меня...... я думаю, это также поможет вам   -  person noor    schedule 10.05.2016
comment
@noor - я пробовал, но, похоже, не работает.   -  person Helping Hands    schedule 10.05.2016


Ответы (2)


Вы используете @BeforeClass в базовом классе, если измените его на @BeforeSuite, тогда не нужно вызывать этот метод настройки. Обычно я буду использовать @BeforeSuite в классе mybase и распространять его на все тестовые классы для работы в этом браузере.

ниже один работал для меня

 import java.util.concurrent.TimeUnit;

 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.firefox.FirefoxDriver;
 import org.testng.annotations.BeforeSuite;

 public class Base {


protected WebDriver driver;
protected String URL = "https://www.google.com/";
public static String SignupURL = "https://www.google.com/";
//public Login loginpage;

@BeforeSuite
public void setup()
{

  //  System.setProperty("webdriver.chrome.driver","E:\\Selenium-Webdriver\\Chrome_Driver\\chromedriver.exe");
    driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.navigate().to(URL);
   // loginpage = PageFactory.initElements(driver,Login.class);

}


}


import org.testng.annotations.Test;

public class TestCasePage1 extends Base{

@Test
public void testit(){
    System.out.println(driver.getTitle());
}

@Test
public void testit1(){
    System.out.println(driver.getTitle());
}

}

Спасибо, Мурали.

person murali selenium    schedule 10.05.2016
comment
Спасибо, но я получаю java.lang.NullPointerException при использовании @BeforeSuite. - person Helping Hands; 10.05.2016
comment
не могли бы вы попробовать один раз, изменив защищенный драйвер WebDriver; к общедоступному статическому драйверу WebDriver; однажды - person murali selenium; 10.05.2016
comment
обновленные ответы .. похоже, что вы получаете нуль из-за логики в этом методе 1, возможно, вы звоните из LoginPage, где драйвер равен нулю - person murali selenium; 10.05.2016
comment
Я не могу комментировать строки, которые вы сделали, потому что каждый метод моей страницы входа возвращает объект типа данных входа :( - person Helping Hands; 10.05.2016
comment
Давайте продолжим обсуждение в чате. - person Helping Hands; 10.05.2016

Проблема в том, что @BeforeClass пропускает (alwaysRun=true). Итак, если в базовом классе вы напишете @BeforeClass(alwaysRun=true). Тогда вам не нужно вызывать setup в других классах.

person David Baak    schedule 10.05.2016