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

如何使用Selenium高效且可复用地验证搜索列表中的记录?

问题分析与解决方案

1. 修复断言报错的核心原因

你原代码中用assertEquals做完全文本匹配,但获取的是整个搜索结果区域的所有文本,显然和单个关键词Vũ Mạnh Hải不相等,这是报错的直接原因。正确的做法是校验结果文本是否包含目标关键词,而非完全匹配:

// 替换原注释的断言逻辑
String resultAreaText = driver.findElement(By.xpath("//*[@id=\"isaleleadl2\"]/div[2]")).getText();
Assert.assertTrue("搜索结果中未找到目标关键词", resultAreaText.contains("Vũ Mạnh Hải"));

如果需要更精准地检查单条记录(而非整个区域),可以定位所有结果项并遍历校验:

// 定位所有搜索结果条目
List<WebElement> resultItems = driver.findElements(By.xpath("//*[@id=\"isaleleadl2\"]/div[2]/div[contains(@class, 'lead-item')]"));
boolean isTargetFound = false;
for (WebElement item : resultItems) {
    if (item.getText().contains("Vũ Mạnh Hải")) {
        isTargetFound = true;
        break;
    }
}
Assert.assertTrue("未在搜索列表中找到Vũ Mạnh Hải", isTargetFound);

2. 优化代码的高效性与可复用性

(1)用显式等待替代硬等待

Thread.sleep是不稳定的硬等待,改用Selenium的WebDriverWait实现智能等待,避免因页面加载慢导致的元素定位失败:

// 封装可复用的显式等待方法
public WebElement waitForElement(By locator, int timeoutSeconds) {
    WebDriverWait wait = new WebDriverWait(driver, timeoutSeconds);
    return wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
}

// 替换原代码中的硬等待和直接findElement
// 示例:等待搜索框并输入关键词
WebElement searchInput = waitForElement(By.xpath("//*[@id=\"fuse-search-bar-input\"]"), 10);
searchInput.sendKeys("Vũ Mạnh Hải");
searchInput.sendKeys(Keys.ENTER);

// 等待搜索结果加载完成
waitForElement(By.xpath("//*[@id=\"isaleleadl2\"]/div[2]"), 10);

(2)拆分核心逻辑为可复用方法

把登录、导航、搜索、校验拆成独立方法,方便后续测试用例调用:

// 登录方法
public void performLogin(String username, String password) {
    waitForElement(By.name("usernameName"), 10).sendKeys(username);
    waitForElement(By.name("passwordName"), 10).sendKeys(password);
    waitForElement(By.xpath("//*[@id=\"login-form\"]/mat-spinner-button/button/span[1]"), 10).click();
}

// 导航到目标搜索页面
public void navigateToLeadListPage() {
    waitForElement(By.xpath("//*[@id=\"fuseSidebar\"]/navbar/navbar-vertical-style-1/div[2]/div[3]/fuse-navigation/div/fuse-nav-vertical-group[1]/div[2]/fuse-nav-vertical-collapsable[1]/a"), 10).click();
    waitForElement(By.xpath("//*[@id=\"fuseSidebar\"]/navbar/navbar-vertical-style-1/div[2]/div[3]/fuse-navigation/div/fuse-nav-vertical-group[1]/div[2]/fuse-nav-vertical-collapsable[1]/div/fuse-nav-vertical-item/a"), 10).click();
}

// 搜索并校验关键词存在性
public boolean searchAndCheckKeyword(String targetKeyword) {
    // 点击搜索按钮
    waitForElement(By.xpath("//*[@id=\"isaleleadl2\"]/div[2]/div[1]/div[2]/fuse-search-bar/div/div/label/button/span[1]"), 10).click();
    // 输入关键词并提交
    WebElement searchInput = waitForElement(By.xpath("//*[@id=\"fuse-search-bar-input\"]"), 10);
    searchInput.clear();
    searchInput.sendKeys(targetKeyword);
    searchInput.sendKeys(Keys.ENTER);
    // 校验结果
    WebElement resultArea = waitForElement(By.xpath("//*[@id=\"isaleleadl2\"]/div[2]"), 10);
    return resultArea.getText().contains(targetKeyword);
}

(3)优化后的测试用例

public void Test_SearchLeadVerification() throws IOException, InterruptedException {
    System.out.println("Verify Testcase: Search lead and check presence");
    // 调用复用方法完成流程
    performLogin("dothicamtu@fecredit.com.vn", "Abc@123456");
    navigateToLeadListPage();
    boolean isKeywordPresent = searchAndCheckKeyword("Vũ Mạnh Hải");
    // 最终断言
    Assert.assertTrue("搜索列表中未找到目标关键词Vũ Mạnh Hải", isKeywordPresent);
}

3. 额外优化建议

  • 定位器简化:避免使用层级极深的XPath(如fuseSidebar相关的长路径),优先使用@data-testid(如果页面提供)、元素文本或简洁的class定位,提升定位稳定性。
  • 分页处理:如果搜索结果超过一页,需要添加分页遍历逻辑,确保检查所有结果。
  • 字符编码:确保测试文件编码为UTF-8,避免越南语字符乱码导致的匹配失败。

内容的提问来源于stack exchange,提问作者Tuan Dat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:25:17