使用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
相关产品推荐
相关产品推荐

