Как перейти к новому окну браузера, который открывается после нажатия кнопки?

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

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

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

Ответ 1

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

// 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)

Ответ 2

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

Возврат в главное окно (окно по умолчанию).

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

Ответ 3

Этот script позволяет вам переключиться с Родительского окна на дочернее окно и вернуться 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

Я использую итератор и цикл 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);
            }

Ответ 5

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

  • Вы не можете закрыть драйвер во время оценки теста, так как он потеряет фокус, прежде чем переключиться на активный элемент, и вы получите NoSuchWindowException.
  • Если тест запущен на ChromeDriver, вы получите не окно, а вкладку на клике в своем приложении. Поскольку SeleniumDriver не может действовать с вкладками, он только переключается между окнами, он зависает при щелчке, где открывается новая вкладка, и сбой при тайм-ауте.

Ответ 6

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

driver.SwitchTo().Window(WindowName);

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

Ответ 7

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

ie_x64_tabprocgrowth.png

  • HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  • Щелкните правой кнопкой мыши → Создать → Строковое значение → Имя значения: TabProcGrowth (создайте, если не существует)
  • TabProcGrowth (щелкните правой кнопкой мыши) → Изменить... → Данные значения: 0

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

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

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

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

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

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

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


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

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

код:

Браузер: IE11 x64 (Zoom: 100%)
ОС: Windows 7 x64
Селен: 3.5.1
WebDriver: IEDriverServer x64 3.5.1

public static String openAndSwitchToWindow(WebDriver driver, WebElement clickableElement, long waitInMillis)
    throws InterruptedException {
  String parentHandle = driver.getWindowHandle(); // Save parent window
  clickableElement.click(); // Open child window
  Thread.sleep(waitInMillis);
  Set<String> handles = driver.getWindowHandles();
  if (handles.size() > 1) { // Check if more than 1 window is open
    for (String handle : handles) {
      driver.switchTo().window(handle);
      if (!parentHandle.equals(handle)) {
        break;
      }
    }
  }
  return parentHandle; // Returns parent window if you want to switch back
}



/* How to use method */
String parentHandle = SeleniumUtil.openAndSwitchToWindow(driver, linkToChildWindow, 5000);

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

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

В приведенном выше коде содержится проверка if, чтобы убедиться, что вы не переключаетесь в родительское окно, поскольку Set<T> не имеет гарантированного заказа в Java. Thread.sleep(), по-видимому, увеличивает вероятность успеха, как подтверждается ниже.

Цитата из Люк Инман-Семерау: (Разработчик для Selenium)

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

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

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


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

Ответ 8

Если у вас более одного браузера (с использованием java 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);
  }

}

Ответ 9

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

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

@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/