java - 并行执行功能文件会导致控制台上打印出空指针异常

标签 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("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="325c5b515a5d5e5341455951010672555f535b5e1c515d5f" rel="noreferrer noopener nofollow">[email protected]</a>");

            // 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;),这在此 group 上突出显示。

问题:

  1. 导致错误的原因是什么?
  2. maven Surefire 插件错误何时应该修复?

最佳答案

我发现“at com.nicholas.StepsDef.AddProduct.navigateToManageProduct(AddProduct.java:65)”方法 page.getLazadaLogo() 发生错误。

我假设驱动程序对象在创建 WebDriverWait waitProductLink = new WebDriverWait(driver, 30); 对象时保持 null。一般来说,WebDriverWait 在其构造函数参数中接受 null,但当我们尝试使用使用 null 创建的等待对象时,它会在运行时抛出错误。

解决方案:

  1. 检查驱动程序在“导航到管理产品”实现步骤中保存的内容。特定于该特定 block 的“启动主页并登录”驱动程序分配的范围。要解决此问题,请将驱动程序变量设为静态,并在步骤“启动主页并登录”实现中为其分配驱动程序对象引用。

  2. 如果这两个步骤并行运行,那么您还需要在“导航到管理产品”实现步骤中创建驱动程序对象。

关于java - 并行执行功能文件会导致控制台上打印出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68322890/

相关文章:

java - 使用 hibernate 和 postgresql 保存实体后检索序列 int 的正确方法?

java - 在请求的方法中访问 SOAP 消息头

spring - 是否可以在集成测试期间禁用 Spring 的 @Async?

java - Java 对象列表到 Cucumber DataTable 以执行差异

java - 在php、bean中,是否允许使用数组来收集变量?

java - Tomcat Web 应用程序管理器未列出已部署的应用程序

ruby - 使用cucumber/capybara时有没有类似于selenium grid的东西?

java - 重用 cucumber 小 cucumber 中的步骤名称

ruby-on-rails - TDD/BDD Rails Cucumber/RSpec 重复

cucumber - 如何在不运行测试的情况下获取所有标签和 cucumber 场景