बटन पर क्लिक करने के बाद खुलने वाली नई ब्राउज़र विंडो पर कैसे स्विच करें?


86

मेरे पास स्थिति है, जब बटन पर क्लिक करने से खोज परिणामों के साथ नई ब्राउज़र विंडो खुलती है।

क्या नई खुली ब्राउज़र विंडो से जुड़ने और फ़ोकस करने का कोई तरीका है?

और इसके साथ काम करें, फिर मूल (पहले) विंडो पर वापस जाएं।


हम स्वचालित रूप से स्विच कर सकते हैं - उन्नत उपयोग के लिए यहां देखें - testautomationguru.com/…
vins

जवाबों:


117

आप नीचे दी गई खिड़कियों के बीच स्विच कर सकते हैं:

// Store the current window handle
String winHandleBefore = driver.getWindowHandle();

// Perform the click operation that opens new window

// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
}

// Perform the actions on new window

// Close the new window, if that window no more required
driver.close();

// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);

// Continue with original browser (first window)

3
मैं Chrome में लगातार काम किए गए समाधान की पुष्टि कर सकता हूं लेकिन IE में नहीं। IE में नए विंडो हैंडल को मान्यता नहीं दी गई है। @Elmue गलत है क्योंकि getWindowHandles()एक सेट लौटाता है और एक सेट ऑर्डर करने की गारंटी नहीं देता है । अंतिम तत्व हमेशा अंतिम विंडो नहीं होता है। मुझे आश्चर्य है कि उनकी टिप्पणी से बहुत उभार आया।
रजत

@ सेवर: मुझे कोई अंदाजा नहीं है कि आप किस बारे में बात कर रहे हैं। मेरे कोड में WindowHandles एक ReadOnlyCollection <string> देता है, जिसके लिए मैं गारंटी दे सकता हूं कि अंतिम प्रविष्टि हमेशा नवीनतम खोला गया विंडो है। मैंने वह परीक्षण किया। यदि यह पूरी तरह से C # में काम करता है, लेकिन जावा में गलत तरीके से लागू किया गया है, तो आपको रिपोर्ट करना चाहिए कि बग के रूप में।
एल्मु

@Elmue यह एक जावा धागा है। कृपया ल्यूकस (सेलेनियम डेवलपर) के बारे में प्रतिक्रिया पढ़ें getWindowHandles()। यह विधि का एक ज्ञात व्यवहार (बग नहीं) है और विशेष रूप से जावा सेट <टी> है। इसलिए, switchTo().window(handles[handles.length-1])जावा में गारंटी नहीं है। AC # समाधान के सही होने का दावा नहीं किया जा सकता है।
रजत

5
@Elmue 3 (और अंतिम) समय के लिए, आपका उत्तर जावा के लिए गलत है जैसा कि डॉक्स और देव द्वारा समर्थित है जो लोगों को MISLEAD कर सकता है। एक उत्तर पोस्ट करें जहां आप कहते हैं कि यह C # के लिए है, कोई समस्या नहीं है। जावा के लिए GitHub में एक समस्या कार्ड उठाएं, आगे बढ़ें। बस आपका जवाब थ्रेड में भाषा के लिए लागू नहीं है और लोग अन्यथा सोच सकते हैं। यदि आप भेद नहीं कर सकते, तो आपकी समझ में कमी है।
चांदी

3
@Elmue वैसे, आप ड्राईवर कहने में भी गलत हैं। क्लोज़ () दोनों विंडो बंद कर देता है। यह केवल करंट को बंद करता है। Driver.quit () सभी उदाहरणों को मारता है। मैं किसी को पहले से ही आप के लिए यह बताया देख सकते हैं। आपकी टिप्पणी गलतियों से भरी है। आपका दिन शुभ हो।
रजत

12

बस सामग्री में जोड़ने के लिए ...

मुख्य विंडो (डिफ़ॉल्ट विंडो) पर वापस जाने के लिए।

उपयोग driver.switchTo().defaultContent();


11

यह स्क्रिप्ट आपको पेरेंट विंडो से चाइल्ड विंडो और बैक कॉन्ट्रेल से पेरेंट विंडो पर स्विच करने में मदद करती है

String parentWindow = driver.getWindowHandle();
Set<String> handles =  driver.getWindowHandles();
   for(String windowHandle  : handles)
       {
       if(!windowHandle.equals(parentWindow))
          {
          driver.switchTo().window(windowHandle);
         <!--Perform your operation here for new window-->
         driver.close(); //closing child window
         driver.switchTo().window(parentWindow); //cntrl to parent window
          }
       }

1
Driver.close () नई विंडो के लिए काम करेगा। यदि यह नया टैब है, तो नए टैब को बंद करने के लिए कोड का उपयोग करें: Driver.findElement (By.cssSelector ("body"))। sendKeys (Keys.CONTROL + "w");
रिपन अल वसीम

4

सूर्या, आपका काम नहीं चलेगा, दो कारणों से:

  1. आप परीक्षण के मूल्यांकन के दौरान ड्राइवर को बंद नहीं कर सकते क्योंकि यह सक्रिय तत्व पर स्विच करने से पहले ध्यान केंद्रित करेगा , और आपको NoSuchWindowException मिल जाएगी।
  2. यदि ChromeDriver पर परीक्षण चलाया जाता है, तो आपको विंडो नहीं मिलेगी, लेकिन आपके एप्लिकेशन में क्लिक पर टैब होगा। जैसा कि सेलेनियमड्राइवर टैब के साथ कार्य नहीं कर सकता है , केवल विंडोज़ के बीच स्विच करता है, यह क्लिक पर लटका होता है जहां नया टैब खुल रहा है, और टाइमआउट पर क्रैश होता है।

1
आप वास्तव में Driver.close () के लिए कॉल का उपयोग कर सकते हैं क्योंकि आप ड्राइवर पर विंडो हैंडल स्विच कर रहे हैं और उस विंडो के लिए कॉल कर रहे हैं जिसे आप वर्तमान में बंद कर रहे हैं। कई विंडो के साथ काम करते समय मैं इसे नियमित रूप से अपने कोड में उपयोग करता हूं। Driver.Quit () कॉल है जो परीक्षण को मार देगा। Chromedriver में आप अभी भी उपलब्ध विंडो की अपनी सूची प्राप्त करने के लिए getWindowHandles () के लिए कॉल कर सकते हैं। मैं वेब परीक्षण में टैब का उपयोग करने का एक कारण नहीं सोच सकता।
बेन

@Elmue मूल प्रश्न में कहा गया है कि एक क्लिक से एक दूसरी विंडो खुलती है जिसमें कई विंडो हैंडल होते हैं। मैं कॉल ड्राइवर बना सकता हूं। क्लोज़ (); और मेरी खिड़की है कि वर्तमान में ध्यान केंद्रित है। फिर मैं अपने चयन के किसी अन्य सक्रिय विंडो में स्विच कर सकता हूं। Driver.close () और driver.quit () समान कार्यक्षमता साझा नहीं करते हैं। Driver.quit () के लिए एक कॉल सक्रिय ड्राइवर उदाहरण को मार देगा, जबकि करीब केवल वर्तमान विंडो हैंडल को मारता है। इसके अलावा, मुझे अभी तक किसी भी कॉल को देखना है जो एक क्लिक के बाद पूरी तरह से एक टैब खोलता है, जब वेबसाइट पर जावास्क्रिप्ट एक नई विंडो बनाता है।
बेन

मैं गलत था और अपनी टिप्पणी को हटा दिया। आप अपना उत्तर भी हटा सकते हैं।
एल्म्यू

3

IE के लिए रजिस्ट्री को संशोधित करें:

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
  2. राइट-क्लिक → नया → स्ट्रिंग मान → मान नाम: TabProcGrowth (यदि मौजूद नहीं है तो बनाएं)
  3. TabProcGrowth (राइट-क्लिक) → संशोधित करें ... → मूल्य डेटा: 0

स्रोत: इंटरनेट एक्सप्लोरर 8-10 में सेलेनियम वेबड्राइवर विंडोज़ स्विचिंग समस्या

मेरे मामले के लिए, IE ने रजिस्ट्री संपादन के बाद नए विंडो हैंडल का पता लगाना शुरू किया।

MSDN ब्लॉग से लिया गया:

टैब प्रोसेस ग्रोथ: वह दर सेट करता है जिस पर IE नई टैब प्रक्रिया बनाता है।

"मैक्स-नंबर" एल्गोरिथ्म: यह एक विशिष्ट अनिवार्य अखंडता स्तर (एमआईसी) पर एकल फ्रेम प्रक्रिया के लिए एकल अलगाव सत्र के लिए निष्पादित की जा सकने वाली टैब प्रक्रियाओं की अधिकतम संख्या को निर्दिष्ट करता है। सापेक्ष मूल्य हैं:

  • TabProcGrowth = 0: टैब और फ़्रेम एक ही प्रक्रिया के भीतर चलते हैं; फ़्रेम एमआईसी स्तरों में एकीकृत नहीं हैं।
  • TabProcGrowth = 1: किसी दिए गए MIC प्रक्रिया के लिए एकल टैब प्रक्रिया में दी गई फ़्रेम प्रक्रिया के लिए सभी टैब।

स्रोत: नया टैब खोलने पर इंटरनेट एक्सप्लोरर 8.0 के साथ एक नई प्रक्रिया शुरू हो सकती है


इंटरनेट विकल्प:

  • सुरक्षा → सभी ज़ोन (इंटरनेट, स्थानीय इंट्रानेट, विश्वसनीय साइट, प्रतिबंधित साइट) के लिए सुरक्षित मोड को अनटिक सक्षम करें
  • उन्नत → सुरक्षा → अनटैक एन्हांस्ड प्रोटेक्टेड मोड सक्षम करें

कोड:

ब्राउज़र: IE11 x64 (ज़ूम: 100%)
OS: विंडोज 7 x64
सेलेनियम: 3.5.1 वेबड्राइवर
: IEDriverServer x64 3.5.1

public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
    Set<String> handles = driver.getWindowHandles();
    // Switch to child window
    for (String handle : handles) {
        driver.switchTo().window(handle);
        if (!parentHandle.equals(handle)) {
            break;
        }
    }
    driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}



/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);

// Do things in child window
driver.close();

// Return to parent window
driver.switchTo().window(parentHandle);

उपरोक्त कोड में एक if-check शामिल है यह सुनिश्चित करने के लिए कि आप मूल विंडो पर स्विच नहीं कर रहे हैं क्योंकि Set<T>जावा में कोई गारंटी आदेश नहीं हैWebDriverWaitनीचे दिए गए बयान के अनुसार सफलता की संभावना बढ़ जाती है।

ल्यूक इनमैन-सेमेरु से उद्धृत : (सेलेनियम के लिए डेवलपर)

ब्राउज़र को नई विंडो को स्वीकार करने में समय लग सकता है, और पॉपअप विंडो दिखाई देने से पहले आप अपने स्विचटॉ () लूप में गिर सकते हैं।

आप स्वचालित रूप से मान लेते हैं कि getWindowHandles () द्वारा दी गई अंतिम विंडो खोली गई अंतिम होगी। यह जरूरी नहीं कि सच हो, क्योंकि उन्हें किसी भी क्रम में वापस करने की गारंटी नहीं है।

स्रोत: IE में एक पॉपअप को संभालने में असमर्थ, नियंत्रण पॉपअप विंडो में स्थानांतरित नहीं हो रहा है


संबंधित पोस्ट:


2

आप उपयोग कर सकते हैं:

driver.SwitchTo().Window(WindowName);

जहां WindowName एक स्ट्रिंग है, जिस विंडो का नाम आप फोकस पर स्विच करना चाहते हैं। इस फ़ंक्शन को मूल विंडो के नाम के साथ फिर से कॉल करें जब आप इसे पूरा कर लें।


1
सुझाव के लिए धन्यवाद, क्या कोई तरीका है, मैं विंडो नाम मास्क कैसे सेट कर सकता हूं? जैसे "विननेम *", जहां * - कोई भी प्रतीक।
वलोडिमिर प्रिसियाज़निअक

1
मेरे निहितार्थ 10 सेकंड है, लेकिन 2 सेकंड में यह मुझे NoSuchWindowException अपवाद देता है।
वलोडिमिर प्रिसियाज़निअक

2

मैं विभिन्न विंडो हैंडल को स्टोर करने के लिए इटरेटर और थोड़ी देर के लूप का उपयोग करता हूं और फिर आगे और पीछे स्विच करता हूं।

//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
            }

यह नए टैब पर स्विच करने में विफल हो रहा है, हालांकि यह वांछित नए टैब पर क्लिक करता है। क्यों?
पौल

क्या इस कोड के कारण परीक्षण बहुत धीमा हो सकता है? ऐसा लगता है कि कोड के इस बिट के बाद newwin में किसी भी कार्य को करने में लगभग 10 मिनट लगते हैं
ह्यूगो

0
 main you can do :

 String mainTab = page.goToNewTab ();
 //do what you want
 page.backToMainPage(mainTab);  

 What you need to have in order to use the main   

        private static Set<String> windows;

            //get all open windows 
            //return current window
            public String initWindows() {
                windows = new HashSet<String>();
                driver.getWindowHandles().stream().forEach(n ->   windows.add(n));
                return driver.getWindowHandle();
            }

            public String getNewWindow() {
                List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
                        .collect(Collectors.toList());
                logger.info(newWindow.get(0));
                return newWindow.get(0);
            }


            public String goToNewTab() {
                String startWindow = driver.initWindows();
                driver.findElement(By.cssSelector("XX")).click();
                String newWindow = driver.getNewWindow();
                driver.switchTo().window(newWindow);
                return startWindow;
            }

            public void backToMainPage(String startWindow) {
                driver.close();
                driver.switchTo().window(startWindow);
            }

0

तो इन समाधानों के साथ समस्या यह है कि आप मान रहे हैं कि खिड़की तुरंत दिखाई देती है (कुछ भी नहीं होता है, और आईई में चीजें काफी कम होती हैं)। आप यह भी मान रहे हैं कि तत्व पर क्लिक करने से पहले केवल एक खिड़की होगी, जो हमेशा ऐसा नहीं होता है। इसके अलावा IE एक अनुमानित क्रम में खिड़की के हैंडल को वापस नहीं करेगा। तो मैं निम्नलिखित करूँगा।

 public String clickAndSwitchWindow(WebElement elementToClick, Duration 
    timeToWaitForWindowToAppear) {
    Set<String> priorHandles = _driver.getWindowHandles();

    elementToClick.click();
    try {
        new WebDriverWait(_driver,
                timeToWaitForWindowToAppear.getSeconds()).until(
                d -> {
                    Set<String> newHandles = d.getWindowHandles();
                    if (newHandles.size() > priorHandles.size()) {
                        for (String newHandle : newHandles) {
                            if (!priorHandles.contains(newHandle)) {
                                d.switchTo().window(newHandle);
                                return true;
                            }
                        }
                        return false;
                    } else {
                        return false;
                    }

                });
    } catch (Exception e) {
        Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
                + " seeing error: \n" + e.getMessage());
    }

    return _driver.getWindowHandle();
}

-1

यदि आपके पास अधिक है तो एक ब्राउज़र (जावा 8 का उपयोग करके)

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class TestLink {

  private static Set<String> windows;

  public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();
    driver.get("file:///C:/Users/radler/Desktop/myLink.html");
    setWindows(driver);
    driver.findElement(By.xpath("//body/a")).click();
    // get new window
    String newWindow = getWindow(driver);
    driver.switchTo().window(newWindow);

    // Perform the actions on new window
    String text = driver.findElement(By.cssSelector(".active")).getText();
    System.out.println(text);

    driver.close();
    // Switch back
    driver.switchTo().window(windows.iterator().next());


    driver.findElement(By.xpath("//body/a")).click();

  }

  private static void setWindows(WebDriver driver) {
    windows = new HashSet<String>();
    driver.getWindowHandles().stream().forEach(n -> windows.add(n));
  }

  private static String getWindow(WebDriver driver) {
    List<String> newWindow = driver.getWindowHandles().stream()
        .filter(n -> windows.contains(n) == false).collect(Collectors.toList());
    System.out.println(newWindow.get(0));
    return newWindow.get(0);
  }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.