Nano Hash - криптовалюты, майнинг, программирование

NullPointerException при попытке чтения данных из файла Excel с помощью Selenium

Я создаю проект Selenium с использованием Maven, в котором я пытаюсь прочитать «имя пользователя» и «пароль» из файла Excel (xlsx).

Вот код -

public class NewTest {

WebDriver driver;


@BeforeTest
public void setup() {
    System.setProperty("webdriver.gecko.driver",Util.FIREFOX_PATH);
    driver = new FirefoxDriver();
    driver.navigate().to(Util.BASE_URL);
}
    

public void readExcel(String filePath, String fileName, String sheetName) throws IOException, InterruptedException {
    File file = new File(filePath+"\\"+fileName);
    FileInputStream fs = new FileInputStream(file);
    Workbook workBook = null;
    String fileExtensionName = fileName.substring(fileName.indexOf("."));
    if (fileExtensionName.equals(".xlsx")) {
        workBook = new XSSFWorkbook(fs); 
    }
    if (fileExtensionName.equals(".xls")) {
        workBook = new HSSFWorkbook(fs);
    }
    Sheet sheet = workBook.getSheet(sheetName);
    int rowCount = sheet.getLastRowNum();
    for (int i = 0; i <= rowCount; i++) {
        Row row = sheet.getRow(i);
        for (int j = 0; j < row.getLastCellNum(); j++) {
            
            driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());
            driver.findElement(By.xpath("//input[@type='password']")).sendKeys(sheet.getRow(i).getCell(j+1).getStringCellValue());
            driver.findElement(By.xpath("//input[@type='submit']")).click();
            Thread.sleep(5000);
            String actualTitle = driver.getTitle();
            String expectedTitle = "Home Page";
            SoftAssert sassert = new SoftAssert();
            sassert.assertEquals(actualTitle, expectedTitle);
            sassert.assertAll();
            break;
        }
    }
    
}

@Test
public static void callingFunction() throws IOException, InterruptedException {
    NewTest newTest = new NewTest();
    String filePath = "C:\\Users\\Sitesh\\Desktop";
    newTest.readExcel(filePath, "Book2.xlsx", "Sheet1");
}
}

Я получаю следующую ошибку -

FAILED: callingFunction
java.lang.NullPointerException
at Guru99_Bank.Guru99_Bank.NewTest.readExcel(NewTest.java:59)
at Guru99_Bank.Guru99_Bank.NewTest.callingFunction(NewTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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.util.ArrayList.forEach(Unknown Source)
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)

Скриншот файла Excel -  введите описание изображения здесь

Ошибка, которую я получаю, находится в этой строке:

driver.findElement (By.xpath (// input [@ type = 'text'])). sendKeys (sheet.getRow (i) .getCell (j) .getStringCellValue ());


  • Возникает исключение нулевой точки, когда экземпляры драйвера отличаются от класса к классу. Подтвердите, что вы используете тот же экземпляр драйвера, пожалуйста, создайте и используйте глобальную переменную для экземпляра драйвера. Какой шаблон проектирования вы используете объектную модель страницы или фабрику страниц? 20.09.2020
  • Я не использую никаких фреймворков, ни POM, ни Page Factory. 21.09.2020

Ответы:


1

Проблема - исключение нулевого указателя

Вы пытаетесь получить доступ к недоступной ячейке

sheet.getRow(i).getCell(j+1)

Это пытается перейти к следующей ячейке от текущей, но эта ячейка не существует

Как работает программа чтения Excel?

Сначала получает первую строку и последовательно анализирует все ячейки, одну за другой. Если ячейка недоступна, она переходит к следующей строке.

Если вы попытаетесь получить доступ к двум ячейкам в одном цикле (sheet.getRow (i) .getCell (j + 1)), он будет работать, только если у вас есть данные в этих ячейках, в противном случае вы получите исключение NP, потому что ничего не там.

Это изображение может прояснить вам  введите описание изображения здесь

Решение:

//rows
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
        Row row = sheet.getRow(i);
        //cells
        for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
            // gettingrow cell
            Cell cell = row.getCell(j);
            driver.findElement(By.xpath("//input[@type='text']")).sendKeys(cell.getStringCellValue());
            driver.findElement(By.xpath("//input[@type='password']")).sendKeys(cell.getStringCellValue());
            driver.findElement(By.xpath("//input[@type='submit']")).click();
            Thread.sleep(5000);
            String actualTitle = driver.getTitle();
            String expectedTitle = "Home Page";
            SoftAssert sassert = new SoftAssert();
            sassert.assertEquals(actualTitle, expectedTitle);
            sassert.assertAll();
        }
    }

также - используйте getPhysicalNumberOfRows () - он возвращает только строки / ячейки с данными.

Позднее обновление для исключения NP

вам нужно добавить веб-драйвер в качестве параметра для вашего метода Excel. Веб-драйвер получает экземпляр, но когда метод readExcel использует значение null, вам необходимо передать инициализированный объект.

Измените метод на

public void readExcel(String filePath, String fileName, String sheetName, WebDriver driver)

и этот призыв к

newTest.readExcel(filePath, "Book2.xlsx", "Sheet1", driver);

и это будет работать.

20.09.2020
  • Спасибо. Но я все еще получаю исключение. После выделения проблемы, предложенной @Senthil Kumar Vaithiyanathan's, я обнаружил, что исключение вызвано строкой Element e = driver.findElement (By.xpath (// input [@ type = 'text'])); 21.09.2020
  • вы можете вставить URL-адрес, чтобы увидеть проблему? 21.09.2020
  • Надеюсь, вы имели в виду URL-адрес веб-сайта под термином «URL-адрес». Вот ссылка: github.com/Sachindra7/Selenium-Guru99-Bank/blob/master/ - Кстати, ошибка появляется в строке 60. Меня удивляет, что эта строка выдает 'NullPointerException', потому что обычно он использовал исключение «элемент не найден», если Selenium испытывал трудности с поиском элемента. 22.09.2020
  • нашел проблему, проверьте мой ответ - я обновил его для ваших нужд 22.09.2020
  • Большое спасибо! Ты спаситель! Нужно ли нам каждый раз передавать объект драйвера в качестве параметра при работе с Excel? Или это всего лишь один своеобразный сценарий? 22.09.2020

  • 2

    Поскольку вы получаете NullPointerException, вы используете цепочку методов, лучше разбить их на меньшие и понять, какой объект на самом деле является нулевым, чтобы найти причину. Без этой информации люди на форуме не смогут помочь

    driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());

    Что-то вроде

    Element e = driver.findElement(By.xpath("//input[@type='text']")); Row row = sheet.getRow(i); Cell c = row.getCell(j); String val = c.getStringCellValue();

    Здесь элемент, строка или ячейка могут иметь значение NULL.

    20.09.2020
  • Да, после вашего предложения я обнаружил, что исключение NullPointerException происходит в строке Element e = driver.findElement (By.xpath (// input [@ type = 'text'])); Мой xpath правильный, вы можете понять, в чем проблема? 21.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..