如何通过HandleOpenDialog检查文件存在性并优化上传流程?
解决方案
要解决文件不存在时卡住的问题,核心是先检查文件是否存在(包括备选路径),再执行文件上传操作,避免唤起对话框后因找不到文件而阻塞。以下是具体实现:
1. 封装文件路径检查逻辑
添加辅助方法,自动遍历主路径和备选路径,返回第一个存在的文件完整路径,找不到则抛出明确异常:
using System.IO; private static string GetValidFilePath(string primaryLocation, string fileName, params string[] alternativeLocations) { // 检查主路径 string primaryFullPath = Path.Combine(primaryLocation, fileName); if (File.Exists(primaryFullPath)) { return primaryFullPath; } // 遍历所有备选路径 foreach (string altLoc in alternativeLocations) { string altFullPath = Path.Combine(altLoc, fileName); if (File.Exists(altFullPath)) { return altFullPath; } } // 所有路径都找不到,抛出异常(替代无意义的卡住) throw new FileNotFoundException( $"未找到目标文件 {fileName},已尝试路径:{primaryLocation},{string.Join(", ", alternativeLocations)}"); }
2. 重构上传方法
修改原UploadFile方法,先获取有效文件路径,再执行上传操作,同时优化等待逻辑:
using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using System; public static void UploadFile(IWebDriver driver, string primaryPhotoLocation, string photoName, params string[] alternativePhotoLocations) { // 统一设置隐式等待(无需重复设置) driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20); // 滚动到按钮位置 IJavaScriptExecutor js = (IJavaScriptExecutor)driver; js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight)"); // 用显式等待定位可点击的按钮(比隐式等待更可靠) WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); IWebElement chooseFileBtn = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[text()='Choose File']"))); // 优先直接点击,不行再用JS触发 try { chooseFileBtn.Click(); } catch (ElementClickInterceptedException) { js.ExecuteScript("arguments[0].click();", chooseFileBtn); } // 获取有效文件路径(找不到会直接抛异常,避免卡住) string validFilePath = GetValidFilePath(primaryPhotoLocation, photoName, alternativePhotoLocations); // 调用文件对话框处理逻辑 HandleOpenDialog hndOpen = new HandleOpenDialog(); hndOpen.fileOpenDialog(Path.GetDirectoryName(validFilePath), Path.GetFileName(validFilePath)); // 替换Thread.Sleep为显式等待(根据实际上传完成的标识调整等待条件) wait.Until(d => d.FindElements(By.CssSelector("[class='upload-success']")).Count > 0 // 示例:等待上传成功元素出现 ); }
关键优化点
- 提前检查文件:在唤起文件选择对话框前确认文件存在,避免因找不到文件导致的阻塞
- 支持多路径备选:通过可变参数传入多个备选路径,自动依次查找
- 异常明确化:找不到文件时抛出
FileNotFoundException,便于测试失败时快速定位问题 - 等待逻辑优化:用显式等待替代
Thread.Sleep,提升代码稳定性和执行效率
内容的提问来源于stack exchange,提问作者Madhavi
相关产品推荐
相关产品推荐

