【问题标题】:Recognising the appearance of Authentication popup in C# Selenium [duplicate]识别 C# Selenium 中身份验证弹出窗口的外观 [重复]
【发布时间】:2019-08-23 10:10:33
【问题描述】:

有什么方法可以识别是否出现了以下身份验证弹出窗口?

我只想在认证时插入用户名和密码 弹出窗口不会发生。

bool popupOccurred = false;

//How to recognize whether popup has occurred or not here    

 if (popupOccurred)
  {
     AutoItX.Send(username);
     Thread.Sleep(1000);
     AutoItX.Send("{TAB}");
     Thread.Sleep(1000);
     AutoItX.Send(password);
     Thread.Sleep(1000);
     AutoItX.Send("{ENTER}");
   }

【问题讨论】:

    标签: c# selenium browser-automation autoit-c#-wrapper


    【解决方案1】:

    您可以使用explicit waits 并等待特定元素可用,如果没有,它将继续执行下一行。

    WebElement loginPopup = (new WebDriverWait(driver, 20)).until(ExpectedConditions.presenceOfElementLocated(By.id("ELEMENT_ID")));
    

    【讨论】:

    • 我帖子中看到的Popup不是浏览器窗口,而是OS的认证弹窗,和这里的弹窗类似(engprod-charter.net/api/pub/cnetloginedge/…)。因此 selenium 无法控制它,您能否提供更多线索我如何获取元素 ID?
    • 啊,感谢您的澄清。我不确定您是否遇到过这篇博文 joecolantonio.com/… 似乎涵盖了您遇到的问题。我还没有尝试过,但想到了分享。
    【解决方案2】:

    你不需要使用 AutoITX 来做你想做的事。

    您使用的 AutoITX 库,我们仅在我们想要“选择”要上传的文件时使用它(当出现将显示系统中文件的弹出窗口时)。

    您在此处看到的是“警报”,并且 selenium 本身有很多实现可以让您处理警报。

    将警报想象成一个单独的“浏览器选项卡”,您希望转到它(切换到它)并处理其上的元素。有许多不同类型的警报。有些会简单地出现并有一个确定按钮,有些会有一个是或否,还有一些(比如你的),将是一个身份验证表单。

    您可以告诉您的 selenium webdriver 切换到警报(当它显示时),然后输入凭据并单击确定。全部通过 webdriver,无需 AutoITX。

    一个简单的实现是:

    //Switch to the alert
    IAlert alertHandler = driver().SwitchTo().Alert();
    //Send the credentials
    alertHandler.SetAuthenticationCredentials("Username", "Password");
    //Switch back to the default content (your main tab).
    driver().SwitchTo().DefaultContent();
    

    还有其他类型的警报的实现

    //Accepts the "OK" alert or clicks "Yes" on the yes/no alert.
    alertHandler.Accept();
    //Clicks Close/Dismiss/No
    alertHandler.Dismiss();
    

    为了回答您关于如何等待警报的原始问题,这是我的实现

    public static bool IsAlertPresent()
    {
        int secondsToWait = 1; //Wait for 1 second.
        try
        {
            new WebDriverWait(driver, TimeSpan.FromSeconds(secondsToWait)).Until(ExpectedConditions.AlertIsPresent());
            return true;
        }
        catch (WebDriverTimeoutException) { return false; }
    }
    

    【讨论】:

    • IsAlertPresent() 没有返回 true 并且失败并出现异常:“对远程 WebDriver 服务器的 URL localhost:9515/session/0e53c17d68e7e898dc0ab98cddde7b1f/… 的 HTTP 请求在 30 秒后超时。”
    • @MishraSaurabh 这里也一样...非常棒且不显眼的解决方案,但它似乎不适用于ChromeDriver
    • @MishraSaurabh 真的不知道这一点(我可以使用 chromedriver 来实现),但是,你可以通过使用 'driver().SwitchTo 来做到这一点,这是一种更“脏”的方式().Alert()' 在 try-catch 无限循环中,只有在成功切换到警报时才退出。如果您需要代码示例,请告诉我,我将编辑答案。
    猜你喜欢
    • 2018-10-21
    • 2019-01-22
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多