#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, и, похоже, он работает нормально. Не уверен, что это хорошая практика, но, похоже, она работает нормально.