Selenium 中的 NullPointerException java
NullPointerException in Selenium with java
谁能帮我解决以下错误:
java.lang.NullPointerException
at gurubank.Test_Bank.test(Test_Bank.java:24)
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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
这是我使用的基础文件:
public class Base1 {
public static WebDriver driver;
@BeforeMethod
public void before(){
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
}
这是我正在尝试的测试 运行:
public class Test_Bank extends Base1 {
public static Logger log =LogManager.getLogger(Test_Bank.class.getName());
@Test(dataProvider = "getdata")
public void test(String username,String mdp) throws InterruptedException {
log.info("start");
Thread.sleep(3000);
WebElement login = driver.findElement(By.xpath("//input[@name='uid']"));
Thread.sleep(3000);
log.info("found");
login.sendKeys(username);
log.info("ok for logging");
login.sendKeys(Keys.TAB);
WebElement password= driver.findElement(By.cssSelector(":focus"));
password.sendKeys(mdp);
WebElement submit= driver.findElement(By.name("btnLogin"));
submit.click();
String titre= driver.getTitle();
System.out.println(titre);
if (titre.equals ("Guru99 Bank Manager HomePage")) {
System.out.println("Logged OK");
}
else {
System.out.println("Loggin Failed");
}
}
@DataProvider
public Object[][] getdata(){
Object[][] data = new Object[2][2];
// combinaison1
data[0][0] = "loggin1";
data[0][1] = "mdp1";
// combinaison2
data[1][0] = "loggin2";
data[1][1] = "mdp2";
}
}
此行发生错误:WebElement login = driver.findElement(By.xpath("//input[@name='uid']"))
尽管我已经在Base1.java中声明了驱动程序。
谢谢你
您在 class Base1
中有一个静态字段 WebDriver driver
,它没有像您假设的那样被初始化,因为 instance 方法 before()
初始化本地同名变量 WebDriver driver = new ChromeDriver();
。当代码流退出此方法时,有关局部变量的信息将丢失。
可能您应该使用静态初始化块来初始化静态字段,而不是 before
方法:
public static WebDriver driver;
static {
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
您的代码看起来不错,只有一处更改。如果您更改了它,那么您的代码应该 运行 完美。只需删除之前方法中的 Webdriver 引用即可。如果您在方法级别给出引用,那么 java 会将其视为方法级别变量。
public class Base1 {
public static WebDriver driver;
@BeforeMethod
public void before(){
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
**WebDriver** driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
}
谁能帮我解决以下错误:
java.lang.NullPointerException
at gurubank.Test_Bank.test(Test_Bank.java:24)
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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
这是我使用的基础文件:
public class Base1 {
public static WebDriver driver;
@BeforeMethod
public void before(){
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
}
这是我正在尝试的测试 运行:
public class Test_Bank extends Base1 {
public static Logger log =LogManager.getLogger(Test_Bank.class.getName());
@Test(dataProvider = "getdata")
public void test(String username,String mdp) throws InterruptedException {
log.info("start");
Thread.sleep(3000);
WebElement login = driver.findElement(By.xpath("//input[@name='uid']"));
Thread.sleep(3000);
log.info("found");
login.sendKeys(username);
log.info("ok for logging");
login.sendKeys(Keys.TAB);
WebElement password= driver.findElement(By.cssSelector(":focus"));
password.sendKeys(mdp);
WebElement submit= driver.findElement(By.name("btnLogin"));
submit.click();
String titre= driver.getTitle();
System.out.println(titre);
if (titre.equals ("Guru99 Bank Manager HomePage")) {
System.out.println("Logged OK");
}
else {
System.out.println("Loggin Failed");
}
}
@DataProvider
public Object[][] getdata(){
Object[][] data = new Object[2][2];
// combinaison1
data[0][0] = "loggin1";
data[0][1] = "mdp1";
// combinaison2
data[1][0] = "loggin2";
data[1][1] = "mdp2";
}
}
此行发生错误:WebElement login = driver.findElement(By.xpath("//input[@name='uid']"))
尽管我已经在Base1.java中声明了驱动程序。
谢谢你
您在 class Base1
中有一个静态字段 WebDriver driver
,它没有像您假设的那样被初始化,因为 instance 方法 before()
初始化本地同名变量 WebDriver driver = new ChromeDriver();
。当代码流退出此方法时,有关局部变量的信息将丢失。
可能您应该使用静态初始化块来初始化静态字段,而不是 before
方法:
public static WebDriver driver;
static {
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
您的代码看起来不错,只有一处更改。如果您更改了它,那么您的代码应该 运行 完美。只需删除之前方法中的 Webdriver 引用即可。如果您在方法级别给出引用,那么 java 会将其视为方法级别变量。
public class Base1 {
public static WebDriver driver;
@BeforeMethod
public void before(){
System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
**WebDriver** driver = new ChromeDriver();
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.demo.guru99.com/V4/");
driver.manage().window().maximize();
}
}