2013-10-14 15 views
6

Próbuję obsłużyć podstawowe okno uwierzytelniania dla moich skryptów WebSersera Selenium przy użyciu AutoIt. Napisałem skrypt do przeglądarki Firefox i Internet Explorer, ale nie działa ona w Chrome.Obsługa uwierzytelniania systemu Windows pojawia się w przeglądarce Chrome

Kiedy spróbowałem zidentyfikować wyskakujące uwierzytelnienie w przeglądarce Chrome, używając AutoIt Window Information Tool, pojawiło się puste. Używam następującego skryptu AutoIt:

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

Wszelkie wskazówki, jak to zrobić, będą pomocne. Nie używam [email protected]:google.com, ponieważ niektóre wyskakujące okna uwierzytelniające pojawiają się w przekierowaniu.

+0

Czy możesz zaktualizować za pomocą narzędzia informacji o oknie? Zastanawiam się, czy wyskakujące okienko uwierzytelniające jest częścią strony ... Ponadto, istnieje duża liczba użytkowników selenu/ekspertów w sqa.stackexchange (zapewnienie jakości oprogramowania, dawniej strona z pytaniami dotyczącymi selenu). – Colyn1337

+0

Jest inny sposób bez użycia AutoIT https://stackoverflow.com/questions/11522434/how-to-handle-login-pop-up-window-using-selenium-webdriver/30067944#30067944 –

Odpowiedz

3

Udało mi się automatycznie kierować okno na tekst, a nie na tytuł okna. Narzędzie Informacji o oknie AutoIt nie rozpoznało tytułu, ale rozpoznało widoczny tekst.

Więc zmieniłem skrypt:

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

To działało w porządku.

+1

Używam Chrome 61.0 .3163.91 64bit. Narzędzie AutoIt v3 Window Info wyświetla okno "Chrome Legacy Window" jako Visible Text i Hidden Text zarówno w głównym oknie przeglądarki Chrome, jak iw prostym oknie dialogowym authn. Nadal próbowałem twojego przykładowego kodu, ale nie znalazłem okna. –

0

Użyłem twojego scenariusza i rozszerzyłem go trochę na moje potrzeby. Użytkownik i hasło nie są zakodowane na sztywno i można je ustawić przy użyciu linii poleceń lub danych wprowadzonych przez użytkownika. Skrypt należy uruchomić tylko raz.

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 

Następnym krokiem byłoby dowiedzieć się, jaki język jest ustawiony w chromie i ustawić tytuł okna od niego zależne.

2

Po pierwsze nie potrzebujesz AutoIt, możesz po prostu użyć interfejsu API Windows. Po drugie, podstawowe okno dialogowe uwierzytelniania Chrome nie jest tradycyjnym oknem, więc nie można uzyskać do niego dostępu (spróbuj użyć Spy ++). Jedynym powodem, dla którego to zadziała, jest to, że przed wywołaniem SendKeys nie przyniesiono innego okna na pierwszy plan. Musisz znaleźć główne okno przeglądarki Chrome, które może wyglądać jak "URL - Google Chrome", przenieść go na wierzch, a następnie wysłać klucze. Oto przykład:

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("]", "{]}"); 
} 

Nadzieję, że pomaga.

+0

Jak można czekać na pojawienie się monitu o zalogowanie? –

+0

@PanuHaaramo można po prostu użyć pętli z opóźnieniem, aby ponowić wywołanie FindWindow, dopóki nie wróci z wynikiem non-0. – scottrudy

+1

Podczas sprawdzania za pomocą narzędzia "Autoit v3 Window Info" tytuł (i wszystkie pozostałe informacje) są takie same dla głównego okna przeglądarki Chrome i podstawowego okna logowania. Tytuł to adres URL. Obecnie mój kod czeka, aż Tytuł będzie prawidłowym adresem URL, ale okno dialogowe logowania jeszcze się nie pojawiło po zmianie tytułu. Mogę sobie z tym poradzić ze snem, ale lepszym rozwiązaniem byłoby czekanie, aż okno dialogowe logowania będzie dostępne. W oknie dialogowym logowania IE i Firefox znajduje się osobne okno, ale nie w przeglądarce Chrome. –

Powiązane problemy