【问题标题】:Handle windows authentication pop up on Chrome在 Chrome 上弹出处理 windows 身份验证
【发布时间】:2013-10-21 20:45:41
【问题描述】:

我正在尝试使用 AutoIt 为我的 Selenium webdriver 脚本处理弹出的基本身份验证。我为 Firefox 和 Internet Explorer 编写了一个脚本,但它不适用于 Chrome。

当我尝试使用AutoIt Window Information Tool 识别 Chrome 上弹出的身份验证时,它显示为空。我正在使用以下 AutoIt 脚本:

WinWaitActive("Authentication Required","","120")
If WinExists("Authentication Required") Then
    Send("username{TAB}")
    Send("password{Enter}")
EndIf

任何让它工作的指针都会有所帮助。我没有使用username@password:google.com,因为重定向时会出现一些身份验证弹出窗口。

【问题讨论】:

  • 你能更新一下窗口信息工具的内容吗?我想知道身份验证弹出窗口是否实际上是页面的一部分...此外,在 sqa.stackexchange(软件质量保证,以前是 selenium 问答网站)上有大量的 selenium 用户/专家。
  • 不使用AutoIT还有另一种方法stackoverflow.com/questions/11522434/…

标签: selenium selenium-webdriver webdriver autoit


【解决方案1】:

请试试这个,我的工作正常,我从 nuget 得到 AutoItX:

AutoItX.WinWait("title of your browser", "", 9); 
AutoItX.WinActivate("title of your browser");
AutoItX.Send("userid");
AutoItX.Send("{TAB}", 0);
AutoItX.Send("password");
AutoItX.Send("{Enter}", 0);

【讨论】:

    【解决方案2】:

    我能够让 AutoIt 通过文本而不是窗口标题来定位窗口。 AutoIt Window Information Tool 无法识别标题,但可以识别可见文本。

    所以我把脚本改成:

    WinWaitActive("","Authentication Required","120")
    If WinExists("","Authentication Required") Then
        Send("username{TAB}")
        Send("password{Enter}")
    EndIf
    

    效果很好。

    【讨论】:

    • 我使用的是 Chrome 61.0.3163.91 64bit。 AutoIt v3 窗口信息工具将“Chrome 旧版窗口”显示为 Chrome 主窗口和基本身份验证对话框的可见文本和隐藏文本。我仍然尝试了您的示例代码,但它没有找到窗口。
    【解决方案3】:

    首先你不需要AutoIt,你可以使用windows API。其次,Chrome 的基本身份验证对话框不是传统的 Window,因此您无法处理它(尝试使用 Spy++)。这会起作用的唯一原因是如果您没有在 SendKeys 调用之前将另一个窗口带到前台。您需要找到父 Chrome 窗口,可能类似于“URL - Google Chrome”,将其移到前面,然后发送密钥。这是一个例子:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    [DllImport("User32.dll")]
    private static extern bool SetForegroundWindow(IntPtr point);
    
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string className, string windowTitle);
    
    public static void SendBasicAuthentication(string username, string password, string windowTitle)
    {
        var hwnd = FindWindow(null, windowTitle);
        if (hwnd.ToInt32() <= 0 || !SetForegroundWindow(hwnd)) return;
        SendKeys.SendWait(username.EscapeStringForSendKeys());
        SendKeys.SendWait("{TAB}");
        SendKeys.SendWait(password.EscapeStringForSendKeys());
        SendKeys.SendWait("{ENTER}");
    }
    
    static string EscapeStringForSendKeys(this string input)
    {
        // https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx
        // must do braces first
        return input.Replace("{", "{{}")
            .Replace("}", "{}}")
            .Replace("^", "{^}")
            .Replace("%", "{%}")
            .Replace("~", "{~}")
            .Replace("(", "{(}")
            .Replace(")", "{)}")
            .Replace("[", "{[}")
            .Replace("]", "{]}");
    }
    

    希望对您有所帮助。

    【讨论】:

    • 如何等待登录提示出现?
    • @PanuHaaramo 你可以使用一个有延迟的循环来重试 FindWindow 调用,直到它返回非 0 结果。
    • 使用“Autoit v3 Window Info”工具检查 Chrome 主窗口和基本登录对话框的标题(和所有其他信息)是否相同。标题是 URL。目前我的代码等待标题成为正确的 URL,但是当标题更改时登录对话框还没有出现。我可以用睡眠来处理这个问题,但更好的解决方案是等到登录对话框可用。在 IE 和 Firefox 中,登录对话框是一个单独的窗口,但在 Chrome 中没有。
    【解决方案4】:

    我使用了您的脚本并根据我的需要对其进行了一些扩展。用户和密码不是硬编码的,可以通过命令行或用户输入来设置。该脚本只需启动一次。

    If(Not IsArray($CmdLine) Or $CmdLine[0] < 2) Then
       $user = InputBox ("User", "Please enter your user", "")
       $pass = InputBox ("Password", "Please enter your password", "", "*M")
    Else
       $user = $CmdLine[1]
       $pass = $CmdLine[2]
    EndIf
    
    
    While(True)
       WinWaitActive("", "Authentifizierung erforderlich","120")
       If WinExists("", "Authentifizierung erforderlich") Then
          Send($user)
          Send("{TAB}")
          Send($pass)
          Send("{Enter}")
          Sleep(1000)
       EndIf
    WEnd
    

    下一步是弄清楚 chrome 中设置了什么语言,并根据它设置窗口标题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2019-04-06
      相关资源
      最近更新 更多