Параллельное выполнение файла функций вызывает исключение нулевого указателя принтер на консоли

#java #cucumber #cucumber-java

Вопрос:

Я пытался закодировать параллельное выполнение файла функций cucumber, но на консоли была выведена такая ошибка:

 [TestNG-PoolService-0] ERROR com.nicholas.StepsDef.ExportProduct - java.lang.NullPointerException

Element info: {Using=xpath, value=//a[@class='log-wrapper']/child::img}
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:205)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:201)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249)
    at com.nicholas.StepsDef.AddProduct.navigateToManageProduct(AddProduct.java:65)
    at ✽.navigate to manage product(file:///C:/Users/nicholaswkc/IdeaProjects/cucumber-java-skeleton/src/test/resources/Features/AddProduct.feature:7)

05:38:22.730 [TestNG-PoolService-0] ERROR com.nicholas.StepsDef.ExportProduct - java.lang.NullPointerException
05:38:22.780 [TestNG-PoolService-0] ERROR com.nicholas.StepsDef.AddProduct - org.openqa.selenium.NoSuchSessionException: invalid session id
 

AddProductPageObject.java

 public By lazadaLogo = By.xpath("//a[@class='log-wrapper']/child::img");
 

AddProduct.java

 public class AddProduct {

    private AddProductPageObject page;
    private ChromeDriver driver;
    private Logger log = LogManager.getLogger(AddProduct.class);
    // ======================================================================
    public AddProduct() {
    }

    @Given("Launch the homepage and login")
    public void launchTheHomepageAndLogin() {
        log.info("Start Login");
        try {
            WebDriverManager.chromedriver().setup();
            driver =  new ChromeDriver();
            WebDriverWait timeWait = new WebDriverWait(driver, 30);
            page = PageFactory.initElements(driver, AddProductPageObject.class);
            driver.navigate().to("https://sellercenter.lazada.com.my/apps/seller/login");
            timeWait.until(ExpectedConditions.visibilityOfElementLocated(page.getLazadaSellerLogo()));

            // Input username
            driver.findElement(page.getUsername()).click();
            driver.findElement(page.getUsername()).clear();
            driver.findElement(page.getUsername()).sendKeys("nicholaswkc34@gmail.com");

            // Input password
            driver.findElement(page.getPassword()).click();
            driver.findElement(page.getPassword()).clear();
            driver.findElement(page.getPassword()).sendKeys("wlx_ 279295");

            // Click submit btn
            driver.findElement(page.getSignInButton()).click();

            //assertThat(page.getPageTitle()).isEqualto("");

            Wait wait = new Wait();
            wait.implicitWait(driver, 5);

        } catch (Exception e) {
            log.error(e);
        }
    }

    @Given("navigate to manage product")
    public void navigateToManageProduct() {
        WebDriverWait waitProductLink = new WebDriverWait(driver, 30);
        waitProductLink.until(ExpectedConditions.visibilityOfElementLocated(page.getLazadaLogo()));
        driver.findElement(page.getProductLink()).click();

        WebDriverWait waitManagedProductLink = new WebDriverWait(driver, 30);
        waitManagedProductLink.until(ExpectedConditions.visibilityOfElementLocated(page.getManageProductLink()));
        driver.findElement(page.getManageProductLink()).click();
    }
 

Более того, когда я запускаю команду mvn, она выскакивает org.testng.xml.XmlSuite.setParallel(Ljava/lang/String;) , которая выделена в этой группе

Вопросы:

  1. В чем причина ошибки?
  2. Когда должна быть исправлена ошибка плагина maven surefire?

Комментарии:

1. Почему голосование закрыто? Это настоящая ошибка, с которой я сталкиваюсь.

2. Мне действительно нужна помощь. Пожалуйста, помогите мне с этой программной ошибкой.

3. ваш вывод также показывает «org.openqa.selenium. Исключение NoSuchSessionException: недопустимый идентификатор сеанса». Это может быть признаком того, что версия драйвера Chrome несовместима с версией вашего браузера Chrome. Следующая ссылка может помочь проверить совместимость: sites.google.com/a/chromium.org/chromedriver/downloads/…

Ответ №1:

Я видел, как произошла ошибка в «на com.nicholas.StepsDef.addProduct.navigateToManageProduct(addProduct.java:65)», метод — страница.getLazadaLogo().

Я предполагаю, что объект драйвера содержит значение null при создании WebDriverWait waitProductLink = new WebDriverWait(driver, 30); объекта. Как правило, WebDriverWait принимает значение null в своем параметре конструктора, но выдает ошибку во время выполнения, когда мы пытались использовать этот объект ожидания, созданный с использованием значения null.

Решения:

  1. Проверьте, что содержит драйвер на шаге «переход к управлению реализацией продукта». Область назначения драйвера «Запуск домашней страницы и вход в систему», специфичная для этого конкретного блока. Чтобы преодолеть эту проблему, сделайте переменную драйвера статической и назначьте ей ссылку на объект драйвера на шаге- «Запустите домашнюю страницу и войдите в систему».
  2. В случае, если эти два шага выполняются параллельно, вам также необходимо создать объект драйвера внутри реализации шага «переход к управлению продуктом».

Комментарии:

1. Именно эта строка кода вызывает ошибку waitProductLink.until(Ожидаемые условия.visibilityOfElementLocated(страница.getLazadaLogo ()));. Я отладил его, но драйвер не равен нулю. Как получилось, что это утверждение не вызвало такого понимания. Я также объявил ChromeDriver статичным.

2. Все мои другие методы выбрасывают исключение NoSuchSessionException. Почему это так. Я должен был объявить драйвер частным в области класса? Сеанс драйвера должен быть доступен для любых методов в классе. Зачем нужно создавать другой объект драйвера в другом методе класса?

3. Я попытался добавить еще один драйвер1 в navigatetToManageProduct, но это все равно не удалось. Пожалуйста, помогите мне. Спасибо.

4. Я обнаружил, что это ожидаемое условие ожидания, которое вызывает исключение, а не драйвер, равно нулю.

5. Это здорово @Николас

Ответ №2:

Решите эту проблему, переместив инициализированный код в метод @Before.