运行项目后显示如下错误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 字段。
问题: 我的 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 字段。