在Selenium脚本中添加Thread.sleep导致执行中断的问题求助
Mac下Selenium添加Thread.sleep后抛出NoSuchWindowException异常分析及解决
问题描述
使用Selenium编写的脚本启动URL并执行点击操作,在任意步骤添加Thread.sleep(2000)时,脚本执行中断并抛出NoSuchWindowException;移除Thread.sleep后脚本可正常执行。该问题仅出现在Mac系统的Chrome浏览器中,Windows系统下无此异常。
异常信息
Dec 26, 2022 3:55:35 PM org.openqa.selenium.support.ui.ExpectedConditions findElement WARNING: WebDriverException thrown by findElement(By.xpath: //button[text()='Continue']) org.openqa.selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found
相关代码
WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments("start-maximized"); options.addArguments("enable-automation"); options.addArguments("--no-sandbox"); options.addArguments("--disable-infobars"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--disable-browser-side-navigation"); options.addArguments("--disable-gpu"); driver = new ChromeDriver(options); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); wait = new WebDriverWait(driver, 30); driver.get("<ApplicationURL>"); Thread.sleep(2000); driver.findElement(By.xpath("<some button to click>")).click();
环境信息
- Chrome浏览器版本:108.0.5359.124
- ChromeDriver版本:108.0.5359.71
- Mac OS版本:Monterey 12.6.2
- Java版本:1.8.0_352
- Selenium版本:3.11.0
原因分析
- Selenium版本兼容性缺陷:使用的Selenium 3.11.0发布于2018年,与较新版本的Chrome(108.x)在Mac系统下存在兼容性问题,强制等待(
Thread.sleep)时,ChromeDriver与Chrome的进程通信易出现异常,导致浏览器窗口被误判为已关闭。 - Mac系统进程优化机制:Mac的系统闲置回收机制可能在
Thread.sleep等待期间,将Chrome的渲染进程标记为闲置并回收,导致WebDriver无法找到对应的web view。 - 无效ChromeOptions参数干扰:
--no-sandbox参数主要用于Linux系统绕过沙箱限制,在Mac下启用该参数可能干扰Chrome正常进程管理,增加窗口异常关闭概率。 - Thread.sleep的不可靠性:强制等待不感知页面状态,若等待期间页面发生跳转或窗口状态变更,后续操作会因找不到原窗口报错。
解决方法
- 替换Thread.sleep为显式等待:使用
WebDriverWait等待目标元素可点击,避免强制等待的盲目性:driver.get("<ApplicationURL>"); // 等待按钮可点击后再执行操作 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("<some button to click>"))).click(); - 升级Selenium版本:将Selenium升级至与Chrome 108.x兼容的版本(如4.5.x及以上),修复旧版本的兼容性缺陷。
- 调整ChromeOptions参数:移除Mac下不必要的
--no-sandbox参数,优化启动配置:ChromeOptions options = new ChromeOptions(); options.addArguments("start-maximized"); options.addArguments("enable-automation"); options.addArguments("--disable-infobars"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--disable-browser-side-navigation"); options.addArguments("--disable-gpu"); - 匹配ChromeDriver与Chrome版本:下载与Chrome浏览器版本(108.0.5359.124)完全一致的ChromeDriver,消除版本差异导致的通信异常。
内容的提问来源于stack exchange,提问作者Vinay Sagar
相关产品推荐
相关产品推荐

