Возвращается исключение нулевого указателя - Java Selenium Webdriver - PullRequest
2 голосов
/ 03 апреля 2019

Получение исключения Null Pointer при запуске теста в Selenium WebDriver с Java.По какой-то причине тест возвращается на нуль, даже если все объявляется правильно (я думаю?).

Что я здесь пропускаю / делаю неправильно?

// Учитывая этот код:

public class HomePage extends DriverSetup{

    @FindBy(className = "ico fa fa-lock")
    static WebElement loginButton;

    public HomePage (WebDriver driver){
        super(driver);
    }


  public static void logInBut(){
        loginButton.click();
  }```



//When running this test:


```public class test1 extends DriverSetup{

    public test1() {
        super(driver);
    }

    @Test
    public void signIn(){

        getDriver().get(URL);

        HomePage.logInBut();

        logInPage.inEmail(" ");
        logInPage.inPassword(" ");


    }```


//Driver Set up:

```public class DriverSetup {

    public static WebDriver driver;

    public DriverSetup(WebDriver driver) {
    }

    public WebDriver getDriver() {
        if(this.driver == null) {
            this.setUp();
        }
        return this.driver;
    }

    public void FindByInitialization (WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    //Set up Driver
    @BeforeClass //Before executing any test in the class do this
    public static void setUp(){

        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Peter.Redondeiro\\Documents" +
        "\\IDEA projects\\ChromeDriver\\chromedriver_win32\\chromedriver.EXE");

        driver = new ChromeDriver();
        driver.manage().window().maximize(); //maximise window when open
    }

    //clear all the cookies after executing each test
    @After
    public void clearCookies(){
        driver.manage().deleteAllCookies(); //delete all the cookies
    }

    //Close browser after executing all the tests in the class
    @AfterClass
    public static void closeBrowser(){
        driver.close();
    }

}```


//Log in page object:

public class logInPage extends DriverSetup{

    //Find the input email box in Login page
    @FindBy(id = "inputEmail")
    private static WebElement inputEmail;

    //Find input password box in Login page
    @FindBy(id = "inputPassword")
    private static WebElement inputPassword;

    //Find LogIn button in Login page
    @FindBy(id = "login")
    private static WebElement logInButton;

    public logInPage(WebDriver driver) {
        super(driver);
    }

    //Confirm that you are on the Login page
    public static String confirmationHeader(){
        return header.getText();
    }

    //Method to enter email in email box
    public static void inEmail(String inEmail){
       inputEmail.sendKeys(inEmail + emailGenerator.randomEmailGenerator());
    }

    //Method to enter password in password box
    public static void inPassword(String PassInput){
       inputPassword.sendKeys(PassInput + passwordGenerator.randomPasswordGenerator());
    }
}```

Это трассировка стека выполнения кода выше:

java.lang.NullPointerException
    at logInPage.inEmail(logInPage.java:46)
    at test1.signIn(test1.java:15)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Process finished with exit code -1

Ответы [ 5 ]

3 голосов
/ 03 апреля 2019

U получает NPE (исключение нулевого указателя) в строке

loginButton.click();

, это означает, что вы выполняете какую-то операцию над объектом, который получил нулевое значение, и в этом случае это не что иное, как loginButton

теперь возникает вопрос: почему кнопка входа в систему равна нулю, когда вы инициализируете ее с помощью

@FindBy(className = "ico fa fa-lock")
static WebElement loginButton;

, это возможно, потому что веб-драйвер не может найти этот элемент и, следовательно, он равен нулю

попробуйте следующие предложения

public HomePage(WebDriver driver) {
    super(driver);
    PageFactory.initElements(driver, this);
}

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

@FindBy(className = "ico")
private WebElement loginButton;

@FindBy(className = "login")
List<WebElement> buttons;

, и, нажимая, вот так

buttons.get(0).click();

иначе попробуйте с помощью javascript click direct, оно обязательно должно работать

((JavascriptExecutor)driver).executeScript("document.getElementsByClassName('login')[0].click()");
1 голос
/ 03 апреля 2019

Кредиты @Ravi, Ответ на мой запрос ниже:

public class HomePage extends DriverSetup{

    @FindBy(className = "login")
    private static List<WebElement> buttons;

    public HomePage (WebDriver driver){
        super(driver);
    }

  public static void logInBut(){
      ((JavascriptExecutor)driver).executeScript("document.getElementsByClassName('login')[0].click()");
  }
}
//Trying with javascript click because of environment issue driver was not able to find elements with @FindBy, hence the web element was null and it was throwing NullPointerException

//If you need to read through to understand please see the comments and read @Ravi's comments in particular!
1 голос
/ 03 апреля 2019

loginButton равно null, поскольку указанный вами локатор не соответствует никому. className принимает один класс в качестве параметра, вы использовали три. Чтобы использовать более одного класса, вам нужно использовать cssSelector

@FindBy(css = ".ico.fa.fa-lock")
static WebElement loginButton;

или xpath

@FindBy(xpath = "//*[@class='ico fa fa-lock']")
static WebElement loginButton;

Не забудьте инициализировать его PageFactory.initElements(driver, HomePage)

1 голос
/ 03 апреля 2019

Попробуйте следующий код.

@FindBy(className = "login")
static WebElement loginButton;

или

@FindBy(xpath ="//a[@class='login']")
static WebElement loginButton;
1 голос
/ 03 апреля 2019

Пожалуйста, проверьте номер строки 55 в HomePage.java

Он говорит:

loginButton.click();

Нулевой указатель, потому что loginButton является нулевым, вероятно, потому что он не инициализирован.

Скорее всего, потому что он не может найти элемент по классам, которые вы упомянули.

Возможно, вы захотите использовать '.'перед именами классов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...