How can selenium web driver get to know when the new window has opened and then resume its execution

后端 未结 7 569
情深已故
情深已故 2020-12-03 07:05

I am facing an issue in automating a web application using selenium web driver.

The webpage has a button which when clicked opens a new window. When I use the follow

相关标签:
7条回答
  • 2020-12-03 07:24

    I finally found the answer, I used the below method to switch to the new window,

    public String switchwindow(String object, String data){
            try {
    
            String winHandleBefore = driver.getWindowHandle();
    
            for(String winHandle : driver.getWindowHandles()){
                driver.switchTo().window(winHandle);
            }
            }catch(Exception e){
            return Constants.KEYWORD_FAIL+ "Unable to Switch Window" + e.getMessage();
            }
            return Constants.KEYWORD_PASS;
            }
    

    To move to parent window, i used the following code,

     public String switchwindowback(String object, String data){
                try {
                    String winHandleBefore = driver.getWindowHandle();
                    driver.close(); 
                    //Switch back to original browser (first window)
                    driver.switchTo().window(winHandleBefore);
                    //continue with original browser (first window)
                }catch(Exception e){
                return Constants.KEYWORD_FAIL+ "Unable to Switch to main window" + e.getMessage();
                }
                return Constants.KEYWORD_PASS;
                }
    

    I think this will help u to switch between the windows.

    0 讨论(0)
  • 2020-12-03 07:25

    Below function can wait for given max time until your new window is open

    public static void waitForWindow(int max_sec_toWait, int noOfExpectedWindow) {
        FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver);
        wait.pollingEvery(Duration.ofMillis(200));
        wait.withTimeout(Duration.ofSeconds(max_sec_toWait));
        wait.ignoring(NoSuchWindowException.class);
        Function<WebDriver, Boolean> function = new Function<WebDriver, Boolean>(){
            @Override
            public Boolean apply(WebDriver driver) {
                Set<String> handel = driver.getWindowHandles();
                if(handel.size() == noOfExpectedWindow) 
                    return true;
                else 
                    return false;
                }
        };      
        wait.until(function);
    }
    
    0 讨论(0)
  • 2020-12-03 07:34

    You could wait until the operation succeeds e.g., in Python:

    from selenium.common.exceptions    import NoSuchWindowException
    from selenium.webdriver.support.ui import WebDriverWait
    
    def found_window(name):
        def predicate(driver):
            try: driver.switch_to_window(name)
            except NoSuchWindowException:
                 return False
            else:
                 return True # found window
        return predicate
    
    driver.find_element_by_id("id of the button that opens new window").click()        
    WebDriverWait(driver, timeout=50).until(found_window("new window name"))
    WebDriverWait(driver, timeout=10).until( # wait until the button is available
        lambda x: x.find_element_by_id("id of button present on newly opened window"))\
        .click()
    
    0 讨论(0)
  • 2020-12-03 07:36

    I use this to wait for window to be opened and it works for me.

    C# code:

    public static void WaitUntilNewWindowIsOpened(this RemoteWebDriver driver, int expectedNumberOfWindows, int maxRetryCount = 100)
        {
            int returnValue;
            bool boolReturnValue;
            for (var i = 0; i < maxRetryCount; Thread.Sleep(100), i++)
            {
                returnValue = driver.WindowHandles.Count;
                boolReturnValue = (returnValue == expectedNumberOfWindows ? true : false);
                if (boolReturnValue)
                {
                    return;
                }
            }
            //try one last time to check for window
            returnValue = driver.WindowHandles.Count;
            boolReturnValue = (returnValue == expectedNumberOfWindows ? true : false);
            if (!boolReturnValue)
            {
                throw new ApplicationException("New window did not open.");
            }
        }
    

    And then i call this method in the code

    Extensions.WaitUntilNewWindowIsOpened(driver, 2);
    
    0 讨论(0)
  • 2020-12-03 07:36

    Although this question already has answers, none of them was useful to me really since I can't rely on getting any new window, I needed to filter even more, so I started using Dadoh's solution but tweaked it until I came up with this solution, hope it will be of some use to someone.

    public async Task<string> WaitUntilNewWindowIsOpen(string expectedWindowTitle, bool switchToWindow, int maxRetryCount = 100)
    {
        string newWindowHandle = await Task.Run(() =>
        {
            string previousWindowHandle = _driver.CurrentWindowHandle;
            int retries = 0;
            while (retries < maxRetryCount)
            {
                foreach (string handle in _driver.WindowHandles)
                {
                    _driver.SwitchTo().Window(handle);
                    string title = _driver.Title;
                    if (title.Equals(expectedWindowTitle))
                    {
                        if(!switchToWindow)
                            _driver.SwitchTo().Window(previousWindowHandle);
                        return handle;
                    }
                }
                retries++;
                Thread.Sleep(100);
            }
            return string.Empty;
        });
        return newWindowHandle;
    }
    

    So in this solution I opted to pass the expected window title as an argument for the function to loop all windows and compare the new window title, this way, it's guaranteed to return the correct window. Here is an example call to this method:

    await WaitUntilNewWindowIsOpen("newWindowTitle", true);
    
    0 讨论(0)
  • 2020-12-03 07:39

    You need to switch the control to pop-up window before doing any operations in it. By using this you can solve your problem.

    Before opening the popup window get the handle of main window and save it.

    String mwh=driver.getWindowHandle();

    Now try to open the popup window by performing some action:

    driver.findElement(By.xpath("")).click();
    
    Set s=driver.getWindowHandles(); //this method will gives you the handles of all opened windows
    
    Iterator ite=s.iterator();
    
    while(ite.hasNext())
    {
        String popupHandle=ite.next().toString();
        if(!popupHandle.contains(mwh))
        {
            driver.switchTo().window(popupHandle);
            /**/here you can perform operation in pop-up window**
            //After finished your operation in pop-up just select the main window again
            driver.switchTo().window(mwh);
        }
    }
    
    0 讨论(0)
提交回复
热议问题