运行项目后显示如下错误java.lang.NullPointerException

The following error java.lang.NullPointerException is displayed after run the project

问题: 我的 classes 是用于设置和测试的挂钩。我尝试使用 WebdriverWait 单击 cookie 弹出窗口,但不起作用。我不知道为什么。

我是 selenium 和自动化测试的初学者,我正在使用 java、TestNG 和 maven 编写 selenium 脚本。当我将所有内容写在一个 class 中时,一切正常,但我想要一个包含所有对象的包、一个用于测试的包和一个带有主要设置的 Hooks。 我做什么 public class 挂钩 { public WebDriver 驱动; @BeforeMethod public void Setup() 抛出 InterruptedException { //为驱动、Firefox实例设置属性 System.setProperty("webdriver.driver.firefox", "C://SeleniumWebdrivers//chromedriver.exe"); //创建驱动对象 WebDriver 驱动程序 = new ChromeDriver(); //最大化页面 driver.manage().window().最大化(); //隐式等待 driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS); driver.get("http://google.com/"); //滚动 // JavascriptExecutor js = (JavascriptExecutor) driver; // js.executeScript("window.scrollBy(0,600)"); }

    @AfterMethod
    public void TearDown(){
       driver.quit();

    }

待测

public class Tests extends Hooks{
    @Test
    public void Test() throws InterruptedException{
        //Arrange
        HomePage homePage = new HomePage(driver);
        //Act
        WebDriverWait wait = new WebDriverWait(driver, 6000);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#onetrust-accept-btn-handler"))).click();
    
        //Assert
        Assert.assertEquals("EVALUAREA APARATULUI LOCOMOTOR", "EVALUAREA APARATULUI LOCOMOTOR")
    }

错误是:

java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:106)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:85)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45)
    at Tests.Test(Tests.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.util.ArrayList.forEach(ArrayList.java:1259)
    at org.testng.TestRunner.privateRun(TestRunner.java:794)
    at org.testng.TestRunner.run(TestRunner.java:596)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
    at org.testng.SuiteRunner.run(SuiteRunner.java:276)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
    at org.testng.TestNG.runSuites(TestNG.java:1063)
    at org.testng.TestNG.run(TestNG.java:1031)
    at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

如何修复这些错误以及为什么会出现这些错误?

我试过的: 我尝试添加 Hooks class,我为 class

添加了不同的属性

public WebDriver driver;

这声明了一个字段,名为 driver。不确定为什么要这样做 public。

WebDriver driver = new ChromeDriver();

这声明了一个局部变量,也被命名为driver,它与您声明的字段完全无关。随着所有局部变量的消失,当您声明它的方法结束时,它不再存在。因为同名,所以该方法中引用变量driver指的是局部变量而不是字段

你真正想要的只是制作第二行:

driver = new ChromeDriver();

因为那样会设置字段,而不是声明一个新的局部变量并对其进行初始化。

此问题与测试无关,只是基本的java问题。

基本上与 rzwitserloot 给出的答案相同,但顺序不同。

java.lang.NullPointerException

堆栈跟踪抱怨 NullPointerException。这意味着应该指向一个对象的引用没有指向任何东西(即引用为空)。

那么为什么它是空的?为此,您必须查看堆栈跟踪的下一部分。每行描述一种方法。每次在另一个方法中调用一个新方法时,都会添加一行。格式为 <package>.<class>.<method>(<file:line>).

    at java.util.Objects.requireNonNull(Objects.java:203)
    at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:106)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:85)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45)
    at Tests.Test(Tests.java:15)

因此前几行不是您的代码。第一行来自java,其他来自selenium。您的代码从 Tests.Test(Tests.java:15).

开始

那么这条线发生了什么?

WebDriverWait wait = new WebDriverWait(driver, 6000);

在这一行中,您正在创建 WebDriverWait 的新实例。您将两个参数传递给构造函数。第二个是一个数字,显然不为空。第一个 driver 是对 WebDriver 的引用。因为另一个参数不能为空,所以这个参数可能是。

那么为什么 driver 会是 null

您已将 driver 声明为 Hooks class 中的一个字段。默认情况下,如果您在声明字段时未分配值,则其值为 null。

public class Hooks
{
    public WebDriver driver;

所以问题找到了。

但是你说,你在Setup方法中给driver一个值!

public class Hooks
{
    public WebDriver driver;
   @BeforeMethod
    public void Setup() throws InterruptedException
    {
        ...
        WebDriver driver = new ChromeDriver();
        ...
    }

因为您在 driver = new ChromeDriver(); 之前添加了 WebDriver,这意味着您已经创建了一个与 class 字段同名的局部变量 driver。因为局部变量比 class 字段更重要 Setup 方法中的 driver 名称现在仅指局部变量。

要将驱动程序分配给字段,您可以在创建新的 ChromeDriver 后使用 this.driver = driver。或者您可以删除 WebDriver 并只写 driver = new ChromeDriver(); 以将新的 ChromeDriver 分配给 class 字段。