Исключение NullPointerException при выполнении тестов в разных файлах компонентов и файлах определений шагов

#java #selenium #selenium-webdriver #nullpointerexception

#java #selenium #selenium-webdriver #исключение nullpointerexception

Вопрос:

У меня не было этой проблемы, когда у меня были все тесты в 1 файле функций и 1 файле определения шага. Однако я решил начать разделение тестов и создал 2 файла функций и 2 файла определений шагов. Однако я получаю ошибку NullPointerException.

Я использую класс глобальных переменных для инициализации браузера и установки драйвера, как указано ниже.

 public class globalVariables {
public WebDriver driver;
public Properties prop;

public WebDriver initializeDriver() throws IOException
{

    prop= new Properties();

    String browserName= "chrome";
    String pathToDriver = "";

    if(browserName.equals("chrome"))
    {
        pathToDriver = "C://Repositories//webDrivers//chromedriver_win32_85.83//chromedriver.exe";
        System.setProperty("webdriver.chrome.driver", pathToDriver);
        driver= new ChromeDriver();
        driver.manage().window().maximize();
        //execute in chrome driver
    }
    
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    return driver;
}
}
  

Файл функции входа (который запускается первым из-за открытия браузера и т. Д.)

  @SmokeTest
 @Login
 Feature: Queries SmokeTest
 Scenario Outline: Login using Chrome
Given I open Chrome
And I browse to Queries
When I login to Queries using "<username>" and "<password>"
And Verify that user is successfully logged in
Then Close Browser

Examples:
| username |  password |
| user1|  pass1 |
| user2|  pass2 |
  

Определение шага для файла функций входа в систему

 public class login_steps extends globalVariables {
@Given("I open Chrome")
public void iOpenChrome() throws Throwable {
    driver = initializeDriver();
   // throw new PendingException();
}

@When("I browse to Queries")
public void iBrowseToQueries() {
    driver.get("https://qry.com/");
   // throw new PendingException();
}

@When("I login to Queries using {string} and {string}")
public void i_login_to_queries_using_and(String string, String string2) {
    driver.findElement(By.id("UserName")).sendKeys(string);
    driver.findElement(By.id("Password")).sendKeys(string2);
    driver.findElement(By.id("btnLogin")).click();
}

@Then("Verify that user is successfully logged in")
public void verifyThatUserIsSuccessfullyLoggedIn() {
    WebElement HomeButton = driver.findElement(By.id("divHomeLink"));
    Assert.assertEquals(true, HomeButton.isDisplayed());
}

@And("Close Browser")
public void closeBrowser() {
    driver.quit();
}
  

}

Поиск файла компонентов

  @SmokeTest
 @Search
Feature: Queries SmokeTest
Scenario: Search Function
Given I open Chrome
And I browse to Queries
Then I login to Queries using "user1" and "pass1"
And Click on Queries Search button
And Enter keyword
And Click Search
Then Close Browser
  

Поиск файла определения шага

 public class search_steps extends globalVariables {

@And("Click on Queries Search button")
public void clickOnQueriesSearchButton() {
    driver.findElement(By.id("imgSearchQueries")).click(); //ERROR IS HERE
}

@And("Enter keyword")
public void enterKeyword() {
    driver.findElement(By.id("txtKeywords")).sendKeys("Smoke Query");
}

@And("Click Search")
public void clickSearch() {
    driver.findElement(By.className("btn-search")).click();
}

}
  

Ответ №1:

Вам необходимо убедиться, что вы используете один и тот же экземпляр драйвера Chrome для всех классов, иначе возникнет исключение с нулевой точкой

Используйте глобальную переменную для экземпляра драйвера

частный статический драйвер Webdriver;(Установите это поверх каждого класса)

Комментарии:

1. Он установлен как общедоступный в классе GlobalVariables. Нужно ли мне изменять это в классе GlobalVariables? или добавить эту строку в каждый файл определений шагов?

2. измените это в классе GlobalVariables

3. Или вы можете создать один класс для функций драйвера и использовать его, чтобы вы не столкнулись с ошибкой нулевой точки, если вы в порядке, я могу привести этот класс здесь?

4. Я написал класс Util для экземпляра драйвера, используя шаблон singleton

5. Я только что добавил ‘static’ в свой класс globablvariables, и, похоже, он работает нормально. Не уверен, что это хорошая практика, но, похоже, она работает нормально.