Selenium与身份验证弹出窗口交互



我已经搜索了这个问题,我所看到的似乎都不起作用。我目前正试图在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;
            }
        }
    

    最新更新