Webdriver selenium,java.lang.NullPointerException,同时尝试查找Webelement

时间:2016-01-27 15:25:24

标签: java excel selenium selenium-webdriver selenium-firefoxdriver

编写完整的代码是为了从excel中获取数据并登录到Gmail,但是在尝试这样做的同时我的浏览器已打开,并且所需的页面也已打开,并且从excel中选择了登录ID并将其存储在变量sUsername中,但是无法找到xpath as- element=driver.findElement(by.id("Email"));但是当我打印元素时它保持" null",其中正如预期的那样是定位符id的一些地址。进一步使用id的地址,我将使用sendkeys在文本框中输入电子邮件地址。

但显示以下错误:

  

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

登录类 - 存在定位器问题: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类,我在其中获取java空指针异常 - 问题存在:at- 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;
    }
}

2 个答案:

答案 0 :(得分:1)

优良作法是内部处理以及明确等待定位元素。如果有页面相关的活动,那么还需要使用等待页面加载。

请遵循以下代码 对于内部等待

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;
}

答案 1 :(得分:0)

只是在这里吐痰,但除了上面提到的复制/粘贴问题之外..我没有看到你在哪里“加载”加载你正在创建的驱动程序实例的gmail页面?像...这样的东西。

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

此外,在执行findElement之前,为“电子邮件”字段设置明确的等待可能是个好主意,因为页面可能仍在呈现:

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")));