Как перейти в новое окно браузера, которое откроется после нажатия на кнопку?
У меня есть ситуация, когда при нажатии на кнопку открывается новое окно браузера с результатами поиска.
есть ли способ подключиться и сосредоточиться на новом открытом окне браузера?
и работать с ним, а затем вернуться обратно в исходное(первое) окно.
11 ответов:
вы можете переключиться между окнами, как показано ниже:
// 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)
просто добавить к содержимому ...
вернуться в Главное окно(окно по умолчанию) .
использовать
driver.switchTo().defaultContent();
этот скрипт поможет вам переключиться с родительское окно до окна и обратно 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 } }
Сурья, твой способ не сработает, по двум причинам:
- вы не можете закрыть драйвер во время оценки теста как он потеряет фокус, перед переключением на активный элемент, и вы получите NoSuchWindowException.
- Если тест выполняется на ChromeDriver вы получите не окно, а вкладку по щелчку в вашем приложении. Как SeleniumDriver не может работать с вкладками, только переключается между окнами, он зависает на щелчок, где открывается новая вкладка, и падает на тайм-аут.
Я использую итератор и цикл 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); }
изменить реестр для IE:
- раздел реестра HKEY_CURRENT_USER\программное обеспечение\Майкрософт\Интернет Эксплорер\Главная
- щелкните правой кнопкой мыши → создать → строковое значение → имя значения: TabProcGrowth (создать, если не существует)
- TabProcGrowth (щелкните правой кнопкой мыши) → изменить... → Значений: 0
источник:Selenium WebDriver проблема переключения windows в Internet Explorer 8-10
в моем случае IE начал обнаруживать новые дескрипторы окон после редактирования реестра.
взято из блога MSDN:
Вкладка Рост Процесса: задает скорость, с которой IE создает новые процессы вкладки.
алгоритм "Max-Number": это определяет максимальное количество процессов tab, которые могут быть выполнены для одного сеанса изоляции для одного процесса кадра на определенном обязательном уровне целостности (MIC). Относительные значения:
- TabProcGrowth=0: вкладки и кадры выполняются в рамках одного процесса; кадры не унифицированы на разных уровнях микрофона.
- TabProcGrowth =1: все вкладки для данного процесса кадра выполняются в одном процессе вкладки для данного уровня микрофона.
источник:открытие новой вкладки может запустить новый процесс с Internet Explorer 8.0
интернет Опции:
- Безопасность → Снять Галочку Включить Защищенный Режим для всех зон (интернет, Местная интрасеть, надежные узлы, ограниченные узлы)
- Дополнительно → Безопасность → Снять Галочку Включить Расширенный Защищенный Режим
код:
браузер: IE11 x64 (масштаб: 100%)
OS: Windows 7 x64
Селена: 3.5.1
WebDriver: IEDriverServer x64 3.5.1public 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>не имеет гарантированного заказа в Java.WebDriverWaitКажется, чтобы увеличить шансы на успех, как показано ниже заявление.цитата из Люк Инман-Semerau: (разработчика для Selenium)
браузер может занять некоторое время подтвердите открытие нового окна, и вы можете попадайте в цикл switchTo () до появления всплывающего окна.
вы автоматически предполагаете, что последнее окно возвращается getWindowHandles () будет последним открытым. Это не обязательно правда, так как они не гарантированно будут возвращены в любом порядке.
источник:не удается обработать всплывающее окно в IE, управление не передается в popup окно
По Теме:
вы могли бы использовать:
driver.SwitchTo().Window(WindowName);где WindowName-это строка, представляющая имя окна, на которое вы хотите переключить фокус. Вызовите эту функцию снова с именем исходного окна, чтобы вернуться к нему, когда вы закончите.
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); }
таким образом, проблема со многими из этих решений заключается в том, что вы предполагаете, что окно появляется мгновенно (ничего не происходит мгновенно, и все происходит значительно менее мгновенно в 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(); }
Если у вас есть более одного браузера (с помощью 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); } }
Мне нравится способ автоматического переключения окон, который я мог бы контролировать с помощью объектов страницы.
когда открыто несколько окон, любой метод из этого объекта страницы будет выполняться в окне браузера, которое имеет соответствующий заголовок.
@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/

Comments