Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle windows authentication pop up on Chrome

I am trying to handle the basic authentication pop up for my Selenium webdriver scripts using AutoIt. I wrote a script for Firefox and Internet Explorer but it doesn't work for Chrome.

When I tried identifying the authentication pop up on Chrome using AutoIt Window Information Tool it came up empty. I am using following AutoIt script:

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

Any pointers to get this to work would be helpful. I am not using username@password:google.com because some authentication pop ups appear on redirection.

like image 380
Pooja Mistry Avatar asked Oct 14 '13 09:10

Pooja Mistry


2 Answers

First of all you don't need AutoIt, you can just use the windows API. Secondly, Chrome's basic authentication dialog is not a traditional Window, so you can't get a handle to it (Try using Spy++). The only reason this would work is if you didn't bring another window to the foreground prior to the SendKeys call. You need to find the parent Chrome window, which may be something like "URL - Google Chrome", move it to the front and then send keys. Here's an example:

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

Hope that helps.

like image 73
scottrudy Avatar answered Oct 18 '22 05:10

scottrudy


I was able to have AutoIt target the window by text, not window title. AutoIt Window Information Tool did not recognize the title but it did recognize the visible text.

So I changed the script to:

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

It worked fine.

like image 30
Pooja Mistry Avatar answered Oct 18 '22 05:10

Pooja Mistry