ChromeDriver 2.33+Selenium 3.1无法处理弹窗:switchTo().alert()返回false求助
解决ChromeDriver 2.33 + Selenium 3.1下无法识别登录凭证弹窗的问题
你遇到的应该是HTTP基础认证弹窗——就是浏览器弹出的那种系统级用户名密码输入框,这种弹窗和网页JS生成的普通alert不是同一类型,这也是为什么你的switchTo().alert()代码检测不到它、一直返回false的核心原因:Selenium的alert()方法只能识别网页层面的JS弹窗,对浏览器原生的HTTP认证弹窗,在你使用的老旧版本驱动组合里支持性很差。
下面给你几个可行的解决方案:
直接将凭证嵌入URL(最简单高效)
这是处理HTTP认证弹窗的经典方案,把用户名和密码直接拼接进请求URL,浏览器会自动填充认证信息并跳过弹窗,在ChromeDriver 2.33版本里完全适用:String username = "你的用户名"; String password = "你的密码"; String targetUrl = "http://需要认证的网站域名/路径"; // 构造带认证信息的URL String authenticatedUrl = targetUrl.replace("http://", "http://" + username + ":" + password + "@"); driver.get(authenticatedUrl);升级ChromeDriver和Selenium版本
你当前使用的版本组合太老旧,存在不少兼容性bug。建议升级到和你本地Chrome浏览器版本匹配的ChromeDriver(ChromeDriver版本需与Chrome大版本对应),同时将Selenium WebDriver升级到3.x系列的稳定版本(比如3.141.59)。新版本对HTTP认证弹窗的支持更完善,你原来的代码可能就能正常捕获弹窗了,后续还可以直接输入凭证:try { Alert alert = driver.switchTo().alert(); alert.sendKeys("用户名" + Keys.TAB + "密码"); alert.accept(); return true; } catch(NoAlertPresentException ex) { return false; } catch(Exception e) { return false; }再次确认弹窗类型
如果你发现弹窗其实是网页自己用JS实现的登录框(不是浏览器系统级弹窗),那问题就变成了元素定位问题,和switchTo().alert()无关,需要用普通的元素定位方法(比如findElement())来操作。
内容的提问来源于stack exchange,提问作者SreejaArukadu Vajrabala
相关产品推荐
相关产品推荐

