2015-01-10 8 views
5

मेरे पास एक बहुत ही सरल सेलेनियम-वेबड्रिवर स्क्रिप्ट है। मैं वेबड्राइवर का उपयोग कर HTTP प्रमाणीकरण करना चाहता हूं।वेबड्राइवर - HTTP प्रमाणीकरण संवाद

स्क्रिप्ट:

WebDriver driver = new FirefoxDriver(); 
driver.get("http://www.httpwatch.com/httpgallery/authentication/"); 
driver.findElement(By.id("displayImage")).click(); 
Thread.sleep(2000); 
driver.switchTo().alert().sendKeys("httpwatch"); 

मुद्दा:

driver.switchTo().alert().sendKeys("httpwatch"); 

फेंकता

org.openqa.selenium.NoAlertPresentException: नहीं चेतावनी मौजूद है

प्रश्न:

  • क्या वेबड्राइवर को अलर्ट के रूप में केवल एक चेतावनी संवाद मिलता है?
  • मेरे पास क्या विकल्प AutoIt या HTTP का उपयोग किए बिना इस स्वचालित करने के लिए कर रहे हैं: // उपयोगकर्ता नाम: पासवर्ड
  • @somesite

संपादित

चेतावनी विधि नीचे है और अभी तक लागू किया गया है प्रतीत नहीं होता है।

driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password")) 

उत्तर

5

समस्या यह है कि यह एक जावास्क्रिप्ट पॉपअप इसलिए आप सेलेनियम के alert() के माध्यम से यह हेरफेर नहीं कर सकते हैं नहीं है।

दोनों AutoIt और URL में प्रस्तुत करने साख है (सबसे आसान विकल्प - बस the url खोल लें और फिर "प्रदर्शन छवि") आप के लिए विकल्प नहीं हैं, एक और दृष्टिकोण AutoAuth firefox addon उपयोग करने के लिए स्वचालित रूप से पहले से सहेजे गए क्रेडेंशियल्स प्रस्तुत करने के लिए हो सकता है:

ऑटोएथ स्वचालित रूप से HTTP प्रमाणीकरण संवाद सबमिट करता है जब आपके पास ब्राउज़र को आपकी लॉगिन जानकारी सहेजने के लिए चुना जाता है। (अगर आपने पहले से ही ब्राउज़र क्या अपने यूज़रनेम और पासवर्ड हैं कहा, और आपको लगता है कि उपयोगकर्ता नाम और पासवर्ड याद रखने के लिए, क्यों नहीं बस यह स्वचालित रूप से ऐसा करने की बजाय आप हर बार पूछने का प्रस्तुत किया है? यह बता दिया है)

जवाब के बाद HTTP Basic Auth via URL in Firefox does not work? सूत्र में सुझाव दिया:

  • AutoAuth फ़ायरफ़ॉक्स प्लग-इन इंस्टॉल;
  • उस साइट पर जाएं जहां प्रमाणीकरण की आवश्यकता है।अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करें और प्रमाण-पत्रों को सहेजना चुनना सुनिश्चित करें;
  • अपनी हार्ड ड्राइव पर ऑटोएथ स्थापना फ़ाइल सहेजें: प्लगइन पेज पर, "फ़ायरफ़ॉक्स में जोड़ें" और "लिंक को इस तरह से सहेजें" पर राइट क्लिक करें;
  • निम्नलिखित के रूप में दृष्टांत फ़ायरफ़ॉक्स webdriver:
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default"); 
File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi"); 
firefoxProfile.addExtension(pluginAutoAuth); 
driver = new FirefoxDriver(firefoxProfile); 

इसके अलावा, AutoIt विकल्प के समान एक तरह से - आप sikuli स्क्रीन मान्यता और स्वचालन उपकरण पॉपअप में साख प्रस्तुत करने के लिए उपयोग कर सकते हैं।

+0

धन्यवाद alecxe कॉल करने के लिए, कोड स्निपेट ऊपर उल्लेख किया है अच्छी तरह से मेरे लिए काम करता है। –

+0

उपरोक्त कोड एफएफ के लिए है। क्रोम और आईई का उपयोग करके मैं वही काम कैसे कर सकता हूं? –

+0

@RiponAlWasim कृपया इसके बारे में एक अलग प्रश्न बनाने पर विचार करें। धन्यवाद। – alecxe

3

बेसिक/NTLM प्रमाणीकरण पॉप-अप एक ब्राउज़र संवाद खिड़की है:


इसके अलावा अन्य विचारों और विकल्प देखें। वेबड्राइवर (सेलेनियम 2.0) ऐसी संवाद विंडो से बातचीत नहीं कर सकता है। इसका कारण यह है कि वेबड्राइवर पूरी तरह से वेबसाइटों के साथ उपयोगकर्ता इंटरैक्शन की नकल करने का लक्ष्य रखता है, और ब्राउज़र डायलॉग विंडो वर्तमान में उस दायरे में नहीं हैं। जावास्क्रिप्ट संवाद विंडोज़ वेबसाइट का हिस्सा हैं, इसलिए वेबड्राइवर उनको संभाल सकता है। सेलेनियम 1.0 में बुनियादी प्रमाणीकरण करना संभव है।

तो इस समस्या को हल करने के लिए कैसे? 1) यूआरएल http://username:[email protected] के माध्यम से प्रमाणीकरण 2) एक ब्राउज़र प्लगइन का उपयोग करें जो मूल/एनटीएलएम ऑटोेंटिकेशन को संभालेगा 3) स्थानीय प्रॉक्सी का उपयोग करें जो अनुरोध शीर्षलेख को संशोधित करेगा और उपयोगकर्ता नाम/पासवर्ड के साथ पास करेगा और 4) एक रोबोट का उपयोग करें, जैसे ऑटोआईटी , या कुछ Java लाइब्रेरी।

विकल्प 1: सबसे आसान है और सिस्टम/परीक्षण पर कम से कम प्रभाव पड़ता है। विकल्प 2: आपके लोडिंग प्लगइन के रूप में एक उच्च ब्राउज़र प्रभाव है। इसके अलावा हर ब्राउज़र अपनी प्लगइन का उपयोग करता है और यह संभव है कि एक निश्चित ब्राउज़र के लिए आवश्यक प्लगइन उपलब्ध न हो। विकल्प 3: HTTP के साथ अच्छी तरह से काम करता है, लेकिन HTTPS को कस्टम प्रमाण पत्र की आवश्यकता होती है, इस प्रकार हमेशा एक विकल्प नहीं होता है। सिस्टम और परीक्षण दोनों पर ज्यादा प्रभाव नहीं पड़ता है। विकल्प 4: माइक्रोसॉफ्ट प्रेस की नकल करता है, यह समाधान पर जाता है लेकिन त्रुटियों के लिए प्रवण होता है। केवल तभी काम करता है जब संवाद विंडो फोकस करती है और यह संभव है कि यह हमेशा मामला न हो।

0

मुझे एक ही समस्या का सामना करना पड़ा, और रोबोट वर्ग का उपयोग करके कुछ ठोस समाधान मिला। इसका कामकाज या समाधान, देखते हैं, लेकिन यह काम करता है।

public class DialogWindow implements Runnable { 

@Override 
public void run() { 
    try { 
     entercredentials(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void entercredentials() InterruptedException { 
    Thread.sleep(5000); 
    try { 
     enterText("username"); 
     enterSpecialChar(KeyEvent.VK_TAB); 
     enterText("password"); 
     enterSpecialChar(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 

    } 
} 

private void enterText(String text) throws AWTException { 
    Robot robot = new Robot(); 
    byte[] bytes = text.getBytes(); 

    for (byte b : bytes) { 
     int bytecode = b; 
     // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
     if (bytecode> 96 && bytecode< 123) 
      bytecode = bytecode - 32; 
     robot.delay(40); 
     robot.keyPress(bytecode); 
     robot.keyRelease(bytecode); 
    } 
} 

private void enterSpecialChar(int s) throws AWTException { 
    Robot robot = new Robot(); 
    robot.delay(40); 
    robot.keyPress(s); 
    robot.keyRelease(s); 
} 

} 

यह कैसे

WebDriver driver= new FirefoxDriver()// or any other driver with capabilities and other required stuff 

(new Thread(new DialogWindow())).start(); 

driver.get(url); 
संबंधित मुद्दे