You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FindElements时触发NullPointerException问题求助

问题描述

我是selenium-cucumber新手,在自动化Web应用时,在Page Object中使用findElements获取所有元素时触发了NullPointerException,此前也遇到过类似问题,恳请提供解决思路。


Feature文件

Feature: I want to select product on the page
Scenario:
Given user is on landing page
When user enters username and password and click clickSignIn
|username|abcd@gmail.com|
|password|Hinata@12|
And user hovers on the category and the product then selects required item
|category|Women                |
|product |tops                 |
|item    |Hoodies & Sweatshirts|
And user exists the browser.

Homepage类(鼠标悬停时会显示更多选项)

public HomePage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }
public void productCategories(String category) {
        try {

            int size = optionsProduct.size();

            for (int i = 0; i < size; i++) {
                String actualText = optionsProduct.get(i).getText();
                String ExpectedText = category;

                if (actualText.equalsIgnoreCase(ExpectedText)) {
                    Actions actions = new Actions(driver);
                    WebElement categoryName = driver.findElement(By.xpath("//li[contains(@class,'level0')]/a/span[2]"));
                    actions.moveToElement(categoryName).perform();
                    System.out.println("===Moved to the Element"+ExpectedText);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Step定义类

public class ProductTests {
    
    WebDriver driver;
    HomePage hp;
    
    
    
    @When("user hovers on the category and the product then selects required item")
    public void user_hovers_on_the_category_and_the_product_then_selects_required_item(DataTable dataTable) {
        hp = new HomePage(driver);
        Map<String, String> formdata = dataTable.asMap();
        String category = formdata.get("category");
        String product = formdata.get("product");
        String item = formdata.get("item");
        System.out.println("Category is"+category+"product is"+product+"item is"+item);
        
        hp.productCategories(category);
        hp.womensOptions(product);
        hp.womensSelection(item);
        
    }

}

错误信息

java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.SearchContext.findElements(org.openqa.selenium.By)" because "this.searchContext" is null

WebDriver实例化代码(BasePage类)

package driverLaunch;

import java.io.FileInputStream;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import io.github.bonigarcia.wdm.WebDriverManager;

public class BasePage {

    WebDriver driver;
    Properties prop;

    public BasePage(WebDriver driver2) {
        this.driver = driver2;
    }

    public WebDriver init_driver(Properties prop) {
        String browser = prop.getProperty("browser");

        if (browser.equals("chrome")) {

            System.setProperty("webdriver.chrome.driver", "src/test/resources/Browser/chromedriver.exe");
            driver = new ChromeDriver();

        } else if (browser.equals("firefox")) {

            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver();

        } else {
            System.out.println("Please provide a proper browser value..");
        }

        driver.manage().window().fullscreen();
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
        driver.get(prop.getProperty("url"));

        return driver;
    }

    public Properties init_properties() {
        prop = new Properties();
        try {
            FileInputStream ip = new FileInputStream("src/test/resources/Config/config.properties");
            prop.load(ip);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return prop;

    }
}

Base类(Given步骤实现)

@Given("user is on landing page")
public void user_is_on_landing_page() {
    
    bp = new BasePage(driver);
    Properties prop = bp.init_properties();
    driver = bp.init_driver(prop);
    
    //Click on SignIn
    hp = new HomePage(driver);
    hp.clickSignIn();
    
}

解决思路

1. 排查optionsProduct元素初始化

错误提示searchContext为null,说明PageFactory初始化的optionsProduct未绑定到有效WebDriver实例。检查HomePage中该元素的注解是否正确,示例:

@FindAll(@FindBy(how = How.XPATH, using = "你的元素定位表达式"))
private List<WebElement> optionsProduct;

确保定位表达式准确,且构造函数中PageFactory.initElements(driver, this)执行成功。

2. 统一WebDriver实例传递

在Step方法中重新创建HomePage实例时,ProductTests类的driver可能为null。需保证该driver与Base类中初始化的实例一致:

  • 可通过将Base类的driver实例传递给Step类,或使用单例模式管理driver,避免实例混乱。

3. 添加元素等待机制

调用optionsProduct.size()前,元素可能未加载完成,导致PageFactory无法定位元素。添加显式等待:

// 在productCategories方法开头添加
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.visibilityOfAllElements(optionsProduct));

4. 复用Page Object实例

Base类中已创建HomePage实例,Step方法无需重复创建。将hp作为Step类的成员变量,复用已初始化的实例,避免元素绑定失效。

5. 调整BasePage初始化逻辑

BasePage构造函数接收driver参数,但init_driver方法又重新赋值driver,易导致实例混乱。建议优化构造逻辑,确保driver实例唯一且有效。


内容的提问来源于stack exchange,提问作者Sri Sai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:35:57