使用Selenium Java测试中断网未触发预期弹窗问题排查
问题分析
你遇到的核心问题是:Selenium旧版的setNetworkConditions API仅模拟了网络请求的离线状态,但没有触发浏览器原生的offline事件——而你的页面弹窗逻辑,正是通过监听浏览器的在线状态变化事件(navigator.onLine的change事件)来触发的。手动断网时系统会自动触发这些事件,所以弹窗正常;但代码设置离线后,事件没触发,页面也就没感知到状态变化,只有刷新时才会检测到离线。
修复方案
改用Selenium 4+支持的Chrome DevTools Protocol(CDP)来设置离线状态,CDP的Network.enable和Network.emulateNetworkConditions不仅能模拟离线,还会正确触发浏览器的在线状态变化事件,让页面的弹窗逻辑正常触发。
修改后的代码示例:
import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v118.network.Network; import java.util.Optional; public void testOfflinePopup() { // 初始化ChromeDriver ChromeDriver driver = new ChromeDriver(); driver.get("你的目标URL"); // 执行登录操作 driver.findElement(By.id("login-username")).sendKeys("username"); driver.findElement(By.id("login-password")).sendKeys("password"); driver.findElement(By.id("signin-button")).click(); // 初始化DevTools并启用Network模块 DevTools devTools = driver.getDevTools(); devTools.createSession(); devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 模拟离线状态,同时触发事件 devTools.send(Network.emulateNetworkConditions( true, // offline:是否离线 5, // latency:延迟(毫秒) 500, // downloadThroughput:下载吞吐量(kbps) 1024, // uploadThroughput:上传吞吐量(kbps) Optional.empty(), Optional.empty() )); // 此时页面应该会触发离线弹窗,可后续添加断言验证弹窗存在 }
额外说明
- 确保你的Selenium版本是4.x以上,旧版本不支持CDP的直接调用
- 如果仍使用旧版Selenium,也可以通过执行JavaScript手动触发
offline事件,在原代码设置完setNetworkConditions后添加:
这种方式可以补触发事件,但不如CDP的方式原生可靠。((JavascriptExecutor) driver).executeScript( "window.dispatchEvent(new Event('offline'));" );
内容的提问来源于stack exchange,提问作者TesterABC
相关产品推荐
相关产品推荐

