Selenium自动化Electron应用:规避文件夹弹窗超时异常方案咨询
解决方案
你的理解是对的:Selenium的Click()方法默认会等待页面的document.readyState变为complete,但弹出Windows原生文件夹选择对话框后,Electron应用的主页面并没有进行新的加载,WebDriver会一直等待直到超时抛出WebDriverException。下面是两种可行的优化方案:
方案一:调整页面加载超时(你的方向是对的)
在点击按钮前临时缩短页面加载超时时间,避免长时间等待,操作完成后恢复原设置,不影响后续流程:
// 保存原有页面加载超时设置 var originalPageLoadTimeout = driver.Manage().Timeouts().PageLoad; // 设置短超时(比如10秒) driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10); try { // 点击打开文件夹选择弹窗的按钮 driver.FindElement(By.CssSelector("button.open-folder")).Click(); } catch (WebDriverException) { // 捕获超时异常,此时弹窗已弹出,直接继续 } finally { // 恢复原有超时设置 driver.Manage().Timeouts().PageLoad = originalPageLoadTimeout; } // 用H.InputSimulator完成路径输入和确认 var inputSim = new InputSimulator(); inputSim.Keyboard.TextEntry(@"D:\Your\Target\Folder"); inputSim.Keyboard.KeyPress(VirtualKeyCode.RETURN);
方案二:用JavaScript执行点击(更优)
通过IJavaScriptExecutor执行点击操作,绕过Selenium默认的页面加载等待逻辑,无需捕获异常:
// 定位打开弹窗的按钮 var openFolderBtn = driver.FindElement(By.Id("open-folder-button")); // 用JS触发点击,不会触发页面加载等待 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", openFolderBtn); // 直接执行模拟键盘操作 var inputSim = new InputSimulator(); inputSim.Keyboard.TextEntry(@"D:\Your\Target\Folder"); inputSim.Keyboard.KeyPress(VirtualKeyCode.RETURN);
方案二更推荐,因为它完全避免了异常捕获的环节,流程更简洁,也不会因超时设置影响其他操作。
内容的提问来源于stack exchange,提问作者user1832478
相关产品推荐
相关产品推荐

