我已经搜索了这个问题,我所看到的似乎都不起作用。我目前正试图在Chrome浏览器中输入用户名和密码的认证框,我找不到一个好的方法来做到这一点在硒。这个问题来自于这样一个事实:在Selenium中的web元素上运行"click"方法实际上会停止所有的执行,直到身份验证框被处理完。我尝试了三种方法:
- 在点击一个web元素之前,创建一个新线程。在该线程中,运行
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
然后运行alert.authenticateUsing(new UserAndPassword("-ssqatest", "Sqa7-3$t"));
这样做的问题是alertipresent实际上在Chrome中不起作用。我可以通过在它后面放一个print语句来确认这一点,并且它永远不会运行,因为它抛出错误"无法确定加载状态"。但是,它在Firefox中可以工作,这让我进行了第二次尝试:
-
与上面的方法相同,但是在Firefox中这不起作用,因为当警报被正确检测到时,authenticateUsing后面的行会抛出selenium.Unsupportedcommandexception。
-
检测到警报后直接在Firefox浏览器中输入"https://username:password@url.com"这不起作用,因为我不能使用Selenium来获取页面的URL,因为web驱动程序是在原始线程上实例化的,该线程在身份验证弹出期间停止了。我宁愿不重新实例化一个新的会话只是为了获得页面的URL。
在这一点上,我能想到的唯一其他方法是使用java的Robot类,但我也不希望这样做,因为它变得相当混乱,需要手动让机器人对每个字符进行按键和释放。
最好的方法是什么?
谢谢
你不需要重新实例化线程。除非我遗漏了什么,你可以用#3,只使用switchTo()
来改变窗口。像这样:
Set<String> windowHandles = driver.getWindowHandles();
for(String handle : windowHandles) {
driver.switchTo().window(handle);
if(driver.getTitle().equals(NEW_WINDOW_TITLE)) {
return;
}
}