2013-10-14 16 views
6

पर विंडोज प्रमाणीकरण पॉप अप को संभालें मैं ऑटोइटी का उपयोग कर अपने सेलेनियम वेबड्राइवर स्क्रिप्ट के लिए मूल प्रमाणीकरण पॉप अप करने की कोशिश कर रहा हूं। मैंने फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर के लिए एक स्क्रिप्ट लिखी लेकिन यह क्रोम के लिए काम नहीं करता है।क्रोम

जब मैंने AutoIt Window Information Tool का उपयोग कर क्रोम पर प्रमाणीकरण पॉप अप करने की कोशिश की तो यह खाली हो गया। मैं उपयोग कर रहा हूँ निम्नलिखित AutoIt स्क्रिप्ट:

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

किसी भी संकेत दिए गए पाने के लिए काम करने के लिए इस उपयोगी होगा। मैं [email protected]:google.com का उपयोग नहीं कर रहा हूं क्योंकि कुछ प्रमाणीकरण पॉप अप पुनर्निर्देशन पर दिखाई देते हैं।

+0

क्या आप विंडो जानकारी उपकरण के साथ अपडेट कर सकते हैं? मैं सोच रहा हूं कि प्रमाणीकरण पॉपअप वास्तव में पृष्ठ का हिस्सा है ... इसके अलावा, sqa.stackexchange (सॉफ़्टवेयर गुणवत्ता आश्वासन, पहले सेलेनियम क्यू एंड ए साइट) पर सेलेनियम उपयोगकर्ता/विशेषज्ञों की एक बड़ी संख्या है। – Colyn1337

+0

ऑटोआईट https://stackoverflow.com/questions/11522434/how-to-handle-login-pop-up-window-using-selenium-webdriver/30067944#30067944 –

उत्तर

3

मैं खिड़की के शीर्षक पर खिड़की को लक्षित करके ऑटोआईटी को लक्षित करने में सक्षम था। ऑटोआईट विंडो सूचना उपकरण शीर्षक को पहचाना नहीं था लेकिन यह दृश्यमान पाठ को पहचानता था।

तो मैं करने के लिए स्क्रिप्ट बदल दिया है:

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

यह ठीक काम किया।

+1

का उपयोग किए बिना एक और तरीका है मैं क्रोम 61.0 का उपयोग कर रहा हूं .3163.91 64 बिट। ऑटोआईटी v3 विंडो इन्फो टूल क्रोम मुख्य विंडो और मूल ऑथन डायलॉग बॉक्स दोनों के लिए दृश्यमान पाठ और छिपी हुई टेक्स्ट के रूप में "क्रोम विरासत विंडो" दिखाता है। मैंने अभी भी आपके नमूना कोड की कोशिश की लेकिन यह खिड़की नहीं ढूंढ रहा है। –

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 

अगला चरण यह पता लगाने के लिए होगा कि क्रोम में कौन सी भाषा स्थापित की गई है और विंडो शीर्षक पर निर्भर है।

2

सबसे पहले आपको ऑटोआईट की आवश्यकता नहीं है, आप केवल विंडोज एपीआई का उपयोग कर सकते हैं। दूसरा, क्रोम का मूल प्रमाणीकरण संवाद पारंपरिक विंडो नहीं है, इसलिए आप इसे संभाल नहीं सकते (Spy ++ का उपयोग करने का प्रयास करें)। यह काम करने का एकमात्र कारण यह है कि अगर आप SendKeys कॉल से पहले एक और विंडो अग्रभूमि में नहीं लाए थे। आपको पैरेंट क्रोम विंडो ढूंढनी होगी, जो "यूआरएल - Google क्रोम" जैसी कुछ हो सकती है, इसे आगे बढ़ें और फिर कुंजी भेजें। यहां एक उदाहरण दिया गया है:

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

आशा है कि मदद करता है।

+0

लॉगिन प्रक्षेपण के लिए आप कैसे प्रतीक्षा करेंगे? –

+0

@ पनुआरारामो आप केवल एक लूप का उपयोग करके FindWindow कॉल को फिर से प्रयास करने के लिए देरी कर सकते हैं जब तक कि यह गैर 0 परिणाम के साथ वापस न आए। – scottrudy

+1

"ऑटोिट v3 विंडो जानकारी" टूल के साथ जांच करना शीर्षक (और अन्य सभी जानकारी) क्रोम मुख्य विंडो और मूल लॉगिन संवाद के लिए समान हैं। शीर्षक यूआरएल है। वर्तमान में मेरा कोड शीर्षक के लिए सही यूआरएल के लिए इंतजार कर रहा है लेकिन जब शीर्षक बदलता है तो लॉगिन संवाद अभी तक नहीं है। मैं इसे नींद से संभाल सकता हूं लेकिन लॉगिन समाधान उपलब्ध होने तक बेहतर समाधान इंतजार करना होगा। आईई और फ़ायरफ़ॉक्स लॉगिन संवाद में एक अलग विंडो है लेकिन क्रोम में नहीं है। –