Исключение нулевого указателя в селеновом огурце JUnit Framework - PullRequest
1 голос
/ 03 июня 2019

Может кто-нибудь сообщить о проблеме в моем коде для исключения нулевого указателя?

Сообщение об ошибке в консоли

  =>test.pages.HomePage@31e75d13<=

    [31mFailed scenarios:[0m
    [31mE2E_Test.feature:3 [0m# Scenario: Test scenario

    1 Scenarios ([31m1 failed[0m)
    10 Steps ([31m1 failed[0m, [36m8 skipped[0m, [32m1 passed[0m)
    0m12.461s

    java.lang.NullPointerException
        at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
        at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
        at com.sun.proxy.$Proxy17.sendKeys(Unknown Source)
        at test.pages.HomePage.enterSearchText(HomePage.java:31)
        at stepDefinitions.Steps.he_search_for(Steps.java:49)
        at ✽.When he search for "test"(E2E_Test.feature:5)

Хотя я получаю объект драйвера и егоЯ не получаю Null, но все равно получаю null pointer exception.

Я пытаюсь запустить код selenium webdriver для автоматизации некоторых тестовых случаев.Здесь я пытаюсь открыть google.com и хочу ввести текст в поле поиска, но после открытия google.com, когда выполнение достигает searchtextbox.sendkeys("test"), выдается null pointer exception.Я попытался отладить его, чтобы увидеть, имеет ли объект класса домашней страницы значение NULL или нет, но он показывает значение, а не NULL.

Это тестовый базовый класс, который я использую для запуска сайта Google и максимизациикод

public class TestBase {

  public static WebDriver driver;
  public static Properties prop;
  public static EventFiringWebDriver e_driver;
  public static WebEventListener eventListener;

  public TestBase() {
    try {
      prop = new Properties();

      FileInputStream ip = new FileInputStream(System.getProperty("user.dir") + "/src/main/java/test" +
        "/config/config.properties");
      prop.load(ip);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  // This method is used to initiatize the site url

  public static void initialization(String url) {
    String browserName = prop.getProperty("browser");

    if (browserName.equals("chrome")) {
      System.setProperty("webdriver.chrome.driver", "C:\\Users\\test\\Downloads\\driver\\chromedriver.exe");
      driver = new ChromeDriver();
    }



    e_driver = new EventFiringWebDriver(driver);
    // Now create object of EventListerHandler to register it with EventFiringWebDriver
    eventListener = new WebEventListener();
    e_driver.register(eventListener);
    driver = e_driver;

    driver.manage().window().maximize();
    driver.manage().deleteAllCookies();
    driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
    driver.manage().timeouts().implicitlyWait(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
    if (url == "google") {
      driver.get(prop.getProperty("url"));
    }

  }
}

//    Steps Definition file (Steps.java):    This is the step defintion file // there is a function he_search_for called where the exception occurs

public class Steps extends TestBase {

  WebDriver driver;
  TestUtil testUtil;

  HomePage homePage;

  @Given("^user is on google home page$")
  public void user_is_on_google_home_page() throws Throwable {
    initialization("google");
    testUtil = new TestUtil();
    homePage = new HomePage(driver);
  }

  @When("^he search for \"([^\"]*)\"$")
  public void he_search_for(String arg1) throws InterruptedException {
    System.out.print("=>" + homePage + "<=");
    homePage.enterSearchText();
  }
}

//    HomePage Class is used to define all the page elements here in this class, i used enterSearchText function to enter the text in a search box. 

public class HomePage extends TestBase {

  @FindBy(name = "q")
  WebElement searchTextBox;


  WebDriver driver;

  // Initializing the Page Objects:
  public HomePage(WebDriver driver) {
    this.driver = driver;
    PageFactory.initElements(driver, this);
  }

  public void enterSearchText() {
    searchTextBox.sendKeys("Test");
  }
}

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Проблема лежит в вашем шаблоне разработки кода между Classes Steps и TestBase. Пожалуйста, обратите внимание

Сначала Class Steps расширяется TestBase , в котором уже объявлена ​​и инициализирована переменная WebDriver. Поэтому вам не нужно снова определять экземпляр WebDriver с помощью Шаги . Поэтому, пожалуйста, удалите "драйвер WebDriver;" снизу спокойствие кода.

public class Steps extends TestBase {

  WebDriver driver;
  TestUtil testUtil;

Во-вторых, Пожалуйста, не объявляйте WebDriver как статическую переменную. Пожалуйста, объявите его как нестатический, так как сохранение статического может также создавать проблемы при параллельном выполнении.

public class TestBase {

  public  WebDriver driver; 

Создание экземпляра WebDriver как нестатического и обеспечение его безопасности в потоке

TestBase.java

public class TestBase {

    public WebDriver driver;
    public static Properties prop;

    // This method is used to initiatize the site url
    public synchronized void initialization(String url) {
        String browserName = prop.getProperty("browser");
        if (browserName.equals("chrome")) {
            System.setProperty("webdriver.chrome.driver", "C:\\Users\\test\\Downloads\\driver\\chromedriver.exe");
            driver = new ChromeDriver();
            DriverManager.setWebDriver(driver);
        }
    }
}

DriverManager.java

import org.openqa.selenium.WebDriver;
public class DriverManager {

public static ThreadLocal<WebDriver> dr = new ThreadLocal<WebDriver>();

public static WebDriver getDriver() {
    return dr.get();
}

public static void setWebDriver(WebDriver driver) {
    dr.set(driver);
}
}
0 голосов
/ 03 июня 2019

Проблема здесь

public class Steps extends TestBase {

  WebDriver driver;
  TestUtil testUtil;

  HomePage homePage;

  @Given("^user is on google home page$")
  public void user_is_on_google_home_page() throws Throwable {
    initialization("google");
    testUtil = new TestUtil();
    homePage = new HomePage(driver);
  }

  @When("^he search for \"([^\"]*)\"$")
  public void he_search_for(String arg1) throws InterruptedException {
    System.out.print("=>" + homePage + "<=");
    homePage.enterSearchText();
  }
}

WebDriver driver равно нулю. Вы инициализировали WebDriver в методе initialization("google"), но вы не присваиваете значение созданного WebDriver вашему driver

Вам может помочь дополнительная строка кода.

  @Given("^user is on google home page$")
  public void user_is_on_google_home_page() throws Throwable {
    initialization("google");
    this.driver = TestBase.driver; //asign initialized WebDriver to this instance variable
    testUtil = new TestUtil();
    homePage = new HomePage(driver);
  }

Вы также можете удалить локальную переменную WebDriver driver. Поскольку TestBase содержит static WebDriver, вы можете просто использовать его напрямую, поскольку используете наследование.

Тем не менее, я настоятельно рекомендую прочитать о WebDriverFactory или любом другом подобном термине, например WebDriverManager. Все, что нужно для обработки WebDriver без создания статического WebDriver. Это вызовет много проблем в будущем при параллельном выполнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...