下面是我遇到java.lang.NullPointerException
错误的代码
错误:[RemoteTestNG]检测到TestNG版本6.14.2 在端口29667上启动ChromeDriver 2.38.552522(437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb) 仅允许本地连接。 2018年7月1日8:21:49 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到的方言:OSS 失败:登录 java.lang.NullPointerException 在org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 在org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 在com.sun.proxy。$ Proxy9.sendKeys(未知来源) 在com.Agec.Actions.LoginPageActions.getLogin(LoginPageActions.java:20) 在com.Agec.Tests.Bat_Suite.Login(Bat_Suite.java:22) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在java.lang.reflect.Method.invoke(未知来源) 在org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 在org.testng.internal.Invoker.invokeMethod(Invoker.java:580) 在org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716) 在org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988) 在org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 在org.testng.TestRunner.privateRun(TestRunner.java:648) 在org.testng.TestRunner.run(TestRunner.java:505) 在org.testng.SuiteRunner.runTest(SuiteRunner.java:455) 在org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) 在org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) 在org.testng.SuiteRunner.run(SuiteRunner.java:364) 在org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) 在org.testng.TestNG.runSuitesSequentially(TestNG.java:1208) 在org.testng.TestNG.runSuitesLocally(TestNG.java:1137) 在org.testng.TestNG.runSuites(TestNG.java:1049) 在org.testng.TestNG.run(TestNG.java:1017) 在org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
================================================ 默认测试
================================================ 默认套件
package com.Mil.Pages;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class LoginPage
{
@FindBy(xpath="//input[@type='text']")
public WebElement CellNo;
@FindBy(xpath="//input[@type='password']")
public WebElement Password;
@FindBy(xpath="//span[text()=Sign in")
public WebElement SignInBtn;
}
package com.Mil.Actions;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import com.Mil.Pages.LoginPage;
import com.Mil.Tests.TestCaseBase;
public class LoginPageActions
{
WebDriver driver;
LoginPage lp=PageFactory.initElements(TestCaseBase.driver, LoginPage.class);
public LoginPageActions(WebDriver driver)
{
this.driver=driver;
}
public void getLogin()
{
lp.CellNo.sendKeys("123");
lp.Password.sendKeys("569");
lp.SignInBtn.click();
}
}
package com.Mil.Tests;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
public class TestCaseBase
{
public static WebDriver driver=null;
@BeforeTest
public void LaunchBrowser() throws Exception
{
Properties Prop=new Properties();
File Fil=new File("C:\\Users\\eclipse-
workspace\\Mil\\TestConfig\\config.properties");
FileInputStream fileInput=new FileInputStream(Fil);
Prop.load(fileInput);
System.setProperty("webdriver.chrome.driver",Prop.getProperty("Chrome_Path"));
driver=new ChromeDriver();
driver.get(Prop.getProperty("Url"));
}
@AfterTest()
public void CloseBrowser()
{
driver.quit();
}
}
package com.Mil.Tests;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.Test;
import com.Mil.Actions.LoginPageActions;
public class Bat_Suite extends TestCaseBase
{
LoginPageActions lpa=PageFactory.initElements(TestCaseBase.driver,
LoginPageActions.class);
@Test(priority=1)
public void Login ()
{
lpa.getLogin();
}
}
答案 0 :(得分:0)
您的驱动程序为空,您正在尝试调用它,但初始化元素为空。 为了解决您的问题,您需要将@BeforeTest更改为@BeforeClass,即使在这种情况下甚至不需要任何TestNG注释。
public class TestCaseBase {
public static WebDriver driver=null;
@BeforeClass
public void LaunchBrowser() throws Exception {
Properties Prop=new Properties();
File Fil=new File("C:\\Users\\eclipse- workspace\\Mil\\TestConfig\\config.properties");
FileInputStream fileInput=new FileInputStream(Fil);
Prop.load(fileInput);
System.setProperty("webdriver.chrome.driver",Prop.getProperty("Chrome_Path"));
driver=new ChromeDriver();
driver.get(Prop.getProperty("Url"));
}
@AfterClass()
public void CloseBrowser() {
driver.quit();
}
}
推荐的解决方案是使用单例创建get驱动程序函数,该函数检查驱动程序是否为null,如果是,则创建新的驱动程序并返回。
并且您必须弄清楚注释类型:
@BeforeSuite:带注释的方法将在此套件中的所有测试之前运行 跑了。
@AfterSuite:带注释的方法将在此套件中的所有测试之后运行 跑了。@BeforeTest:带注释的方法将在属于任何测试方法之前运行 标签内的类运行。 @AfterTest:带注释的方法将在所有测试方法之后运行 属于标签内的类的已经运行。
@BeforeGroups:此配置方法将运行的组的列表 之前。保证此方法可以在第一次测试前不久运行 属于这些组中任何一个的方法都将被调用。
@AfterGroups:此配置方法将要使用的组列表 追赶。保证此方法在最后一个之后不久运行 属于这些组中任何一个的测试方法都将被调用。@BeforeClass:带注释的方法将在第一次测试之前运行 当前类中的方法被调用。 @AfterClass:带注释的方法将在所有测试之后运行 当前类中的方法已经运行。
@BeforeMethod:带注释的方法将在每次测试之前运行 方法。
@AfterMethod:带注释的方法将在每个测试方法之后运行。来自TestNG文档。
@BeforeTest在XML运行器中的标记之前起作用。