Selenium Webdriver, java.lang.NullPointerException, при попытке найти Webelement

Полный код написан для извлечения данных из excel и входа в Gmail, но при попытке сделать это мой браузер открылся, а также открылась нужная страница, а также идентификатор входа был выбран из excel и сохранен в переменной sUsername, но не удалось чтобы найти xpath как-element=driver.findElement(by.id("Email"));, но когда я печатаю элемент, он содержит «null», где, как и ожидалось, был какой-то адрес идентификатора локатора. Кроме того, используя адрес идентификатора, который я бы использовал с 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;
    }
}

person Arvind Chhajer    schedule 27.01.2016    source источник
comment
Метод login1 выглядит неправильно вставленным. возвращаемый элемент является блоком catch, не возвращает его.   -  person murali selenium    schedule 27.01.2016
comment
Что это Login1.userName(driver)? Подпись WebElement userName(). Вы когда-нибудь инициализировали driver в SignIN? Кроме того, пожалуйста, вставьте всю трассировку стека. Мы не можем видеть, какая строка № 21 в вашем списке.   -  person Würgspaß    schedule 27.01.2016
comment
Login1 — это имя класса, в котором я определил метод userName, который возвращает WebELement, который передается в Login1.username (драйвер), и с помощью метода sendkeys я передаю имя пользователя, хранящееся в файле excel. Драйвер не инициализируется только в основном методе. один раз и строка № 21-Login1.userName(driver).sendKeys(sUsername); это в классе входа, я надеюсь, что приведенное выше объяснение поможет .. спасибо   -  person Arvind Chhajer    schedule 28.01.2016
comment
Ваш объект драйвера никогда не инициализируется в классе SignIn. Таким образом, исключение нулевого указателя как private static WebDriver driver=null;, ur no where предоставляет объект драйвера класса Utils классу SignIn. :)   -  person Vivek Singh    schedule 29.01.2016
comment
обновленный комментарий ---------------- Однажды я уже инициализировал драйвер веб-драйвера =new FirefoxDriver(); в классе Utils1, поэтому нет необходимости снова инициализировать драйвер, поскольку он уже определен как общедоступный статический класс Utils1, и поток похож на класс знака, в котором я вызвал методы, определенные в классе входа, где написано выражение возврата ...   -  person Arvind Chhajer    schedule 30.01.2016


Ответы (2)


Хорошей практикой является работа как с внутренним, так и с явным ожиданием обнаружения элемента. Если есть активность, связанная со страницей, также необходимо использовать ожидание загрузки страницы.

Пожалуйста, следуйте приведенному ниже коду. Для внутреннего ожидания

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;
}
person Sanjay Bhimani    schedule 28.01.2016

Просто плюйте сюда, но в дополнение к проблемам копирования/вставки, указанным выше. Я не вижу, где вы делаете «получить», чтобы загрузить страницу 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")));
person Dave    schedule 27.01.2016
comment
Я не верю, что это проблема ожидания, так как ошибка отличается, если элемент не найден, а не нулевое исключение. - person Arvind Chhajer; 28.01.2016