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
相关产品推荐
相关产品推荐

