Проблемы при вызове метода из другого класса в программе с использованием testng с Java - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в тестировании с селеном и Java.Пытался автоматизировать функцию входа в банковское приложение:

В процессе я столкнулся с исключением из-за нулевого указателя для одного из методов.

Для начала у меня есть два класса:

  1. open (в этот класс входит метод открытия браузера, входа с учетными данными и закрытия браузера с использованием @BeforeMethod, @Test и @AfterMethod)

  2. login (это включает метод, который имеет учетные данные)

Я пытаюсь вызвать метод из класса login в класс, открытый в @Test аннотация.Может ли кто-нибудь помочь мне с ошибкой ниже

Класс открыт:

package Jprogramming;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.*;

public class open {
    WebDriver driver;

    @BeforeMethod
    public void link() {
        System.out.println("setting bank application");
        System.setProperty("webdriver.chrome.driver","E:\\Java_Work\\chromedriver_win32\\chromedriver.exe" );
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        driver.get("https://parabank.parasoft.com");
        driver.manage().window().maximize();
    }

    @Test
    public void credentials() {
        login la = new login(driver);
        la.username();
        la.password();
        la.login();
    }

    @AfterMethod
    public void teardown() {
        driver.quit();
    }
}

Класс входа:

package Jprogramming;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class login {
    WebDriver driver;

    By username = By.name("username");
    By password = By.name("password");
    By login = By.xpath("//*[@id='loginPanel']/form/div[3]/input");

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

    public void username() {
        driver.findElement(username).sendKeys("abc");
    }

    public void password() {
        driver.findElement(password).sendKeys("cba");
    }

    public void login() {
        driver.findElement(login).click();
    }
}

Я вижу ниже ошибку:

 [RemoteTestNG] detected TestNG version 6.14.2
 setting bank application
 Starting ChromeDriver 2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387) on port 47261
 Only local connections are allowed.
 May 06, 2019 1:53:42 PM org.openqa.selenium.remote.ProtocolHandshake createSession
 INFO: Detected dialect: OSS
 FAILED CONFIGURATION: @AfterMethod teardown
 java.lang.NullPointerException
    at Jprogramming.open.teardown(open.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:59)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:455)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:222)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

    FAILED: credentials
    java.lang.NullPointerException
        at Jprogramming.login.username(login.java:18)
        at Jprogramming.open.credentials(open.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:580)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
        at org.testng.TestRunner.privateRun(TestRunner.java:648)
        at org.testng.TestRunner.run(TestRunner.java:505)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
        at org.testng.SuiteRunner.run(SuiteRunner.java:364)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
        at org.testng.TestNG.runSuites(TestNG.java:1049)
        at org.testng.TestNG.run(TestNG.java:1017)
        at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)


    ===============================================
        Default test
        Tests run: 1, Failures: 1, Skips: 0
        Configuration Failures: 1, Skips: 0
    ===============================================


    ===============================================
    Default suite
    Total tests run: 1, Failures: 1, Skips: 0
    Configuration Failures: 1, Skips: 0
    ===============================================

Ответы [ 2 ]

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

Проблема в том, что вы назначаете WebDriver локальной переменной внутри link(), а не переменной экземпляра.

Изменить строку

WebDriver driver = new ChromeDriver();

для

driver = new ChromeDriver();
0 голосов
/ 07 мая 2019

Этот ответ неверен и основан на ложных предположениях. Оставив его здесь для контекста

Хотя я не могу сказать наверняка, я вполне уверен, что @BeforeMethod работает в отдельном экземпляре класса, чем @test.

Так что вы можете с этим поделать? Любой из этих вариантов может работать:

  1. сделать WebDriver static таким образом, чтобы driver был общим для всех экземпляров.

    static WebDriver driver;
    
  2. Используйте @BeforeTest вместо @BeforeMethod

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

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