我正在尝试使用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
,因为重定向会出现一些身份验证弹出窗口。
答案 0 :(得分:3)
我能够让AutoIt按文字定位窗口,而不是窗口标题。 AutoIt窗口信息工具无法识别标题,但它确实识别了可见文本。
所以我将脚本更改为:
WinWaitActive("","Authentication Required","120")
If WinExists("","Authentication Required") Then
Send("username{TAB}")
Send("password{Enter}")
EndIf
工作正常。
答案 1 :(得分:2)
首先,您不需要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("]", "{]}");
}
希望有所帮助。
答案 2 :(得分:0)
我使用了你的脚本并根据我的需要扩展了一点。用户和密码不是硬编码的,可以通过命令行或用户输入进行设置。该脚本只需启动一次。
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中设置的语言,并根据它设置窗口标题。
答案 3 :(得分:0)
请尝试一下,我的正在工作,我从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);