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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:07:26