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

标签 java selenium

我已经搜索过这个问题,但我所看到的似乎都不起作用。我目前正在尝试在 Chrome 中的身份验证框中输入用户名和密码,但我找不到在 Selenium 中执行此操作的好方法。问题来自于这样一个事实:在 Selenium 中的 Web 元素上运行“click”方法会有效地停止所有执行,直到处理完身份验证框为止。我尝试了三种方法:

  1. 在单击网络元素之前,创建一个新线程。在该线程中,运行
    警报警报 = wait.until(ExpectedConditions.alertIsPresent()); 然后运行 ​​alert.authenticateUsing(new UserAndPassword("-ssqatest", "Sqa7-3$t"));

问题是alertIsPresent实际上在Chrome中不起作用。我可以通过在其后面放置一个打印语句来确认这一点,并且它永远不会运行,因为它会抛出错误“无法确定加载状态”。然而,它在 Firefox 中工作,这导致我进行第二次尝试:

  • 与上面的方法相同,但在 Firefox 中 这不起作用,因为当正确检测到警报时,authenticateUsing 之后的行会抛出 selenium.Unsupportedcommandception。

  • 检测到警报后直接在 Firefox 浏览器中输入“https://username:password@url.com ” 这不起作用,因为我无法使用 Selenium 获取页面的 URL,因为 Webdriver 是在原始线程上实例化的,该线程在身份验证弹出窗口期间停止了。我不想只是为了获取页面的 URL 而重新实例化新 session 。

  • 此时,我能想到的唯一其他方法是使用 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;
            }
        }
    

    关于java - Selenium 与身份验证弹出窗口交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455003/

    相关文章:

    java - 从 AJP 连接器请求中检索 Shibboleth 属性

    java - 位掩码 0b1 解析回 int

    java - 如何处理过时的元素引用: element is not attached to the page document

    ruby-on-rails - 使用 RSPEC 进行测试时突然莫名其妙的事件记录连接超时

    html - 子 XPath 轴和后代 XPath 轴有什么区别?

    java - 简单的 Java 程序奇怪的输出

    Java斐波那契数列快速方法

    java - 应用程序关闭后 MediaPlayer 继续播放

    java - 如何在 Selenium Java 代码中使用 By.parameter?

    java - Selenium java 。通过 linkText 导航 WebElement 问题