Как перейти в новое окно браузера, которое открывается после нажатия на кнопку? - PullRequest
74 голосов
/ 06 марта 2012

У меня есть ситуация, когда при нажатии на кнопку открывается новое окно браузера с результатами поиска.

Можно ли подключиться и сфокусироваться на новом открытом окне браузера?

И поработайте с ним, затем вернитесь в исходное (первое) окно.

Ответы [ 11 ]

97 голосов
/ 07 марта 2012

Вы можете переключаться между окнами, как показано ниже:

// 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)
12 голосов
/ 22 января 2013

Просто добавить к содержанию ...

Чтобы вернуться в главное окно (окно по умолчанию).

использовать driver.switchTo().defaultContent();

11 голосов
/ 24 июня 2013

Этот скрипт помогает переключаться с Родительского окна на Дочернее окно и обратно cntrl на Родительское окно

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
          }
       }
4 голосов
/ 31 июля 2012

Сурья, ваш путь не сработает по двум причинам:

  1. вы не можете закрыть драйвер во время оценки теста, так как он потеряет фокус перед переключениемк активному элементу, и вы получите NoSuchWindowException.
  2. , если тест будет запущен на ChromeDriver, вы получите не окно, а вкладку при нажатии в приложении.Так как SeleniumDriver не может работать с вкладками , он переключается только между окнами, зависает при нажатии на месте открытия новой вкладки и вылетает по таймауту.
2 голосов
/ 13 августа 2017

Изменить реестр для IE:

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Internet Explorer \ Main
  2. Right-нажмите кнопку → Создать → Строковое значение → Имя значения: TabProcGrowth (создать, если не существует)
  3. TabProcGrowth (щелчок правой кнопкой мыши) → Изменить ... → Данные значения: 0

Источник: Проблема переключения окон Selenium WebDriver в Internet Explorer 8-10

В моем случае IE начал обнаруживать дескрипторы новых окон после редактирования реестра.

Взято из блога MSDN:

Рост процесса вкладки: Устанавливает скорость, с которой IE создает процессы New Tab.

Алгоритм "Max-Number":Это определяет максимальное количество процессов вкладок, которые могут быть выполнены для одного сеанса изоляции для одного процесса кадра на определенном обязательном уровне целостности (MIC).Относительные значения:

  • TabProcGrowth = 0: вкладки и фреймы выполняются в одном процессе;кадры не объединены на всех уровнях MIC.
  • TabProcGrowth = 1: все вкладки для данного процесса кадра выполняются в процессе с одной вкладкой для данного уровня MIC.

Source: Открытие новой вкладки может запустить новый процесс с Internet Explorer 8.0


Свойства обозревателя:

  • Безопасность → Снять отметку Включить защищенный режим для всех зон (Интернет, Локальная интрасеть, Надежные сайты, Ограниченные сайты)
  • Дополнительно → Безопасность → Снять отметку Включить Расширенный защищенный режим

Код:

Браузер: IE11 x64 (Увеличение: 100%)
ОС: Windows 7 x64
Selenium: 3.5.1
WebDriver: 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 для выполненияубедитесь, что вы не переключаетесь в родительское окно, так как Set<T> не имеет гарантированного порядка в Java WebDriverWait увеличивает вероятность успеха, что подтверждается приведенным ниже утверждением.

Цитируется из Luke Inman-Semerau : (Разработчик для Selenium)

Theбраузеру может потребоваться время для подтверждения нового окна, и вы можете попасть в цикл switchTo () до появления всплывающего окна.

Вы автоматически предполагаете, что последнее окно, возвращаемое getWindowHandles (), будет последнимоткрыт.Это не обязательно так, поскольку не гарантируется, что они будут возвращены в любом порядке.

Источник: Невозможно обработать всплывающее окно в IE, элемент управления не передается всплывающему окну


Похожие сообщения:

2 голосов
/ 02 июня 2012

Я использую итератор и цикл while для хранения различных дескрипторов окна, а затем переключаюсь назад и вперед.

//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);
            }
2 голосов
/ 06 марта 2012

Вы можете использовать:

driver.SwitchTo().Window(WindowName);

Где WindowName - строка, представляющая имя окна, на которое вы хотите переключить фокус. Вызовите эту функцию еще раз с именем исходного окна, чтобы вернуться к нему, когда вы закончите.

0 голосов
/ 27 мая 2018

Таким образом, проблема многих из этих решений заключается в том, что вы предполагаете, что окно появляется мгновенно (мгновенно ничего не происходит, а в IE все происходит значительно реже).Также вы предполагаете, что до щелчка на элементе будет только одно окно, что не всегда так.Также 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();
}
0 голосов
/ 10 января 2018
 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 голосов
/ 07 июня 2017

Мне нравится способ автоматического переключения окон, которым я мог бы управлять с помощью объектов страницы.

Когда открыто несколько окон, любой метод из этого объекта страницы будет выполняться в окне браузера, которое имеетсоответствующий заголовок.

@Window(".* some windows title goes here .*")
public class ToolsQANewWindow {

    // your page object code

}

Проверьте здесь подробные шаги - http://www.testautomationguru.com/selenium-webdriver-automatic-switching-between-browser-windows-using-guice-method-interceptor/

...