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

Selenium如何等待ASP.Net页面中DevExpress数据网格加载完成?

针对DevExpress数据网格的加载等待方案

DevExpress数据网格的加载状态并不完全依赖document.readyState,以下是几种无需线程休眠的可靠等待方案:

方案1:等待加载遮罩消失

DevExpress网格加载时通常会显示内置的加载遮罩,可通过等待该遮罩元素不可见判断加载完成:

protected void waitForDevExpressGridLoad() {
    Wait<WebDriver> wait = new WebDriverWait(driver, Duration.ofSeconds(30));
    // 替换为页面实际使用的加载遮罩选择器,不同版本类名可能不同
    wait.until(ExpectedConditions.invisibilityOfElementLocated(
        By.cssSelector(".dx-datagrid-loading-panel, .dx-loadindicator-container")
    ));
}

注:可通过浏览器开发者工具查看加载中的元素,确认准确的CSS选择器。

方案2:通过客户端API判断加载状态

DevExpress的网格组件暴露了客户端API,可直接通过JavaScript查询数据加载状态:

protected void waitForGridLoadViaClientAPI() {
    Wait<WebDriver> wait = new WebDriverWait(driver, Duration.ofSeconds(30));
    wait.until(driver -> {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        // 替换为你的网格ID,若页面有多个网格需逐个处理
        return (boolean) js.executeScript("""
            const grid = DevExpress.ui.dxDataGrid.getInstance(document.getElementById('your-grid-id'));
            return grid.getController('data').isLoaded() && !grid.isLoading();
        """);
    });
}

方案3:等待数据行稳定渲染

如果网格加载完成后会渲染数据行,可等待行元素出现且数量稳定:

protected void waitForGridRowsStable() {
    Wait<WebDriver> wait = new WebDriverWait(driver, Duration.ofSeconds(30));
    // 先等待至少一行数据出现
    wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".dx-data-row")));
    
    // 等待行数量不再变化,确认数据加载完成
    wait.until(driver -> {
        int rowCount = driver.findElements(By.cssSelector(".dx-data-row")).size();
        try {
            // 短时间等待,避免分批加载时误判,不属于不合理线程休眠
            Thread.sleep(500);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return rowCount == driver.findElements(By.cssSelector(".dx-data-row")).size();
    });
}

方案4:兼容加载弹窗的场景

针对存在加载弹窗的场景,可结合弹窗和网格的状态判断:

protected void waitForGridWithPopup() {
    Wait<WebDriver> wait = new WebDriverWait(driver, Duration.ofSeconds(30));
    
    // 先处理加载弹窗:若出现则等待其消失
    try {
        wait.until(ExpectedConditions.visibilityOfElementLocated(
            By.cssSelector(".dx-popup-wrapper .dx-loadindicator")
        ));
    } catch (TimeoutException e) {
        // 无加载弹窗,直接跳过
    }
    wait.until(ExpectedConditions.invisibilityOfElementLocated(
        By.cssSelector(".dx-popup-wrapper .dx-loadindicator")
    ));
    
    // 再等待网格自身加载完成
    wait.until(ExpectedConditions.invisibilityOfElementLocated(
        By.cssSelector(".dx-datagrid-loading-panel")
    ));
}

内容的提问来源于stack exchange,提问作者D. Barnett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:39