Selenium自动化测试问题:无法验证购物车价格区间排序(页面重载异常)
Selenium自动化测试:价格区间筛选Bug的断言优化方案
问题背景
首次使用Selenium开展自动化测试,需验证Bug:点击购物车价格区间排序链接时,未加载对应页面而是重载当前页面。现有测试代码通过对比点击前后的URL断言,但因URL携带参数变化(?perpage=25&pricepoint=2),断言无法命中该Bug,需更换断言方式。
现有测试代码
测试方法
@Test(priority = 2 , groups = {"smoke"}) public void verifyFilterByPrice(){ ProductDetailPage productdetailpage = new ProductDetailPage(driver); productdetailpage.NavigateToItemDescriptionPage(); String urlBefore = productdetailpage.getCurrentPageUrl(); productdetailpage.clickPriceRange(); String urlAfter = productdetailpage.getCurrentPageUrl(); Assert.assertNotEquals(urlBefore, urlAfter, "Page URL didn't change after clicking Price Range."); }
辅助方法
public String getCurrentPageUrl(){ try { Thread.sleep(Duration.ofSeconds(5)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } String currentPageUrl = driver.getCurrentUrl(); System.out.println("the curent url you capture is " + currentPageUrl); return currentPageUrl; }
捕获的URL对比
URL before = https://xxxx/s/zzz/ URL after = https://xxxx/s/zzz/?perpage=25&pricepoint=2
替代断言方案
1. 断言页面核心内容变化
Bug的本质是点击后页面未加载对应筛选内容,可直接验证商品列表是否符合价格区间,或筛选标签的激活状态:
@Test(priority = 2 , groups = {"smoke"}) public void verifyFilterByPrice(){ ProductDetailPage productdetailpage = new ProductDetailPage(driver); productdetailpage.NavigateToItemDescriptionPage(); // 记录筛选前的商品数量 int productCountBefore = productdetailpage.getProductListSize(); productdetailpage.clickPriceRange(); // 断言筛选标签处于激活状态 Assert.assertTrue(productdetailpage.isPriceRangeFilterActive(), "价格区间筛选未激活"); // 断言商品列表内容变化 int productCountAfter = productdetailpage.getProductListSize(); Assert.assertNotEquals(productCountBefore, productCountAfter, "点击价格区间后商品列表未更新"); // 可选:验证每个商品价格在筛选区间内 double minPrice = 0; // 替换为目标区间最小值 double maxPrice = 100; // 替换为目标区间最大值 List<WebElement> productPrices = productdetailpage.getProductPrices(); for(WebElement priceElement : productPrices) { double price = Double.parseDouble(priceElement.getText().replaceAll("[^0-9.]", "")); Assert.assertTrue(price >= minPrice && price <= maxPrice, "商品价格不在筛选区间内"); } }
2. 替换固定等待为显式等待,断言页面DOM更新
原代码用Thread.sleep稳定性差,改用显式等待监听页面DOM变化,再结合内容断言:
// 优化getCurrentPageUrl方法 public String getCurrentPageUrl(){ // 等待商品列表元素失效(说明页面已重新渲染) new WebDriverWait(driver, Duration.ofSeconds(10)).until( ExpectedConditions.stalenessOf(productdetailpage.getProductListElement()) ); String currentPageUrl = driver.getCurrentUrl(); System.out.println("捕获到的当前URL是 " + currentPageUrl); return currentPageUrl; } // 测试方法中增加内容断言 @Test(priority = 2 , groups = {"smoke"}) public void verifyFilterByPrice(){ ProductDetailPage productdetailpage = new ProductDetailPage(driver); productdetailpage.NavigateToItemDescriptionPage(); String pageContentBefore = driver.findElement(By.tagName("body")).getText(); productdetailpage.clickPriceRange(); String pageContentAfter = driver.findElement(By.tagName("body")).getText(); Assert.assertNotEquals(pageContentBefore, pageContentAfter, "点击价格区间后页面内容未更新"); }
3. 监听网络请求验证筛选行为
若页面通过AJAX加载筛选结果,可监听网络请求确认是否触发了有效的价格筛选接口:
@Test(priority = 2 , groups = {"smoke"}) public void verifyFilterByPrice(){ ProductDetailPage productdetailpage = new ProductDetailPage(driver); productdetailpage.NavigateToItemDescriptionPage(); // 初始化Chrome DevTools监听网络请求 ChromeDevTools cd = ((ChromeDriver)driver).getDevTools(); cd.createSession(); cd.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 记录请求 List<RequestWillBeSent> requests = new ArrayList<>(); cd.addListener(Network.requestWillBeSent(), requests::add); productdetailpage.clickPriceRange(); // 等待并断言存在价格筛选请求 boolean hasPriceFilterRequest = new WebDriverWait(driver, Duration.ofSeconds(10)).until(d -> requests.stream().anyMatch(r -> r.getRequest().getUrl().contains("pricepoint=2")) ); Assert.assertTrue(hasPriceFilterRequest, "未触发价格筛选接口请求"); // 可选:验证请求响应成功 List<ResponseReceived> responses = new ArrayList<>(); cd.addListener(Network.responseReceived(), responses::add); boolean isRequestSuccess = responses.stream().anyMatch(r -> r.getResponse().getUrl().contains("pricepoint=2") && r.getResponse().getStatus() == 200 ); Assert.assertTrue(isRequestSuccess, "价格筛选接口请求失败"); }
4. 断言页面标题或元数据变化
若筛选后页面标题或元数据会更新,可直接对比:
@Test(priority = 2 , groups = {"smoke"}) public void verifyFilterByPrice(){ ProductDetailPage productdetailpage = new ProductDetailPage(driver); productdetailpage.NavigateToItemDescriptionPage(); String titleBefore = driver.getTitle(); productdetailpage.clickPriceRange(); String titleAfter = driver.getTitle(); Assert.assertNotEquals(titleBefore, titleAfter, "点击价格区间后页面标题未更新"); }
内容的提问来源于stack exchange,提问作者Samathi kisalka Sapumana
相关产品推荐
相关产品推荐

