Webdriverselenium,java.lang.NullPointerException,而试图find一个Webelement

编写完整的代码是为了从excel中获取数据并login到Gmail,但在尝试这样做的时候,我的浏览器已经打开,并且打开了所需的页面,并且从excel中选取了loginID,并将其存储在variablessUsername中,但无法findxpath as- element=driver.findElement(by.id("Email")); 但是当我打印元素它保存“空”,如预期的是一些地址的定位器ID。 进一步通过使用id的地址,我会使用sendkeys在文本框中input电子邮件地址。

但是显示了以下错误:

java.lang.NullPointerException在appModules.SignIN.Execute(SignIN.java:21)

login类 – 在哪里定位器问题存在:at – Login1.userName(driver).sendKeys(sUsername);

 public class Login1 { //private static WebDriver driver=null; private static WebElement element=null; public static WebElement userName(WebDriver driver) { try { System.out.println("aaa"); System.out.println("bb"); element=driver.findElement(By.name("Email")); System.out.println("ccc"); } catch (Exception e) { // TODO: handle exception System.out.println(element); } return element; } public static WebElement btn_login(WebDriver driver) { element= driver.findElement(By.id("next")); return element; } public static WebElement passWord(WebDriver driver) { element= driver.findElement(By.id("Passwd")); return element; } public static WebElement btn_SignIN(WebDriver driver) { element= driver.findElement(By.id("signIn")); return element; } } 

这是SigniN类,其中IAM获取Java空指针exception – 问题存在:在 – Login1.userName(driver).sendKeys(sUsername);

 public class SignIN { private static WebDriver driver=null; public static void Execute (int iTestCaseRow) { String sUsername=ExcelUtils1.getCellData(iTestCaseRow,Constant1.col_UserName); System.out.println(sUsername); //driver.ma3nage().window().maximize(); //driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); Login1.userName(driver).sendKeys(sUsername); //driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); Login1.btn_login(driver).click(); String pass=ExcelUtils1.getCellData(iTestCaseRow, Constant1.col_password1); Login1.passWord(driver).sendKeys(pass); Login1.btn_SignIN(driver).click(); } } 

这是我实例化浏览器的地方 –

 public class Utils1 { public static WebDriver driver; public static WebDriver OpenBrowser(int iTestCaseRow) { String sBrowserName; System.out.println(iTestCaseRow); sBrowserName = ExcelUtils1.getCellData(iTestCaseRow, Constant1.col_browser); if (sBrowserName.equals("Mozilla")) { driver = new FirefoxDriver(); // Log.info("New driver instantiated"); driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); // Log.info("Implicit wait applied on the driver for 10 seconds"); driver.get(Constant1.URL); // Log.info("Web application launched successfully"); } return driver; } } 

在内部处理以及显式等待定位元素是一个好习惯。 如果有页面相关的活动,那么还需要使用等待页面加载。

请按照下面的代码进行内部等待

 protected WebElement waitForPresent(final String locator) { // timeout is your default wait timeout in long. return waitForPresent(locator, timeout); } 

对于明确的等待

 protected WebElement waitForPresent(final String locator, long timeout) { WebDriverWait wait = new WebDriverWait(driver, timeout); WebElement ele = null; try { ele = wait.until(ExpectedConditions .presenceOfElementLocated(locator)); } catch (Exception e) { throw e; } return ele; } protected WebElement waitForNotPresent(final String locator, long timeout) { timeout = timeout * 1000; long startTime = System.currentTimeMillis(); WebElement ele = null; while ((System.currentTimeMillis() - startTime) < timeout) { try { ele = findElement(locator); Thread.sleep(1000); } catch (Exception e) { break; } } return ele; } 

只是吐在这里,但除了上面所述的复制/粘贴问题..我不明白你在哪里做一个“获取”加载您正在创build的驱动程序实例的Gmail页面? 就像是..

 driver.get("https://mail.google.com/something"); 

另外,在执行findElement之前,为“Email”字段准备一个明确的等待可能是一个好主意,因为页面可能仍在呈现:

 Wait<WebDriver> doFluentWait = fluentWait = new FluentWait<>(driver).withTimeout(PAGE_LOAD_WAIT, TimeUnit.SECONDS) .pollingEvery(POLLING_INTERVAL, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); 

然后做类似的事情

  doFluentWait.until(WebDriverUtil.elementIsVisible(By.name("Email")));