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

