У меня ситуация, когда при нажатии на кнопку открывается новое окно браузера с результатами поиска.
Есть ли способ подключиться и сосредоточиться в новом открытом окне браузера?
И поработайте с ним, затем вернитесь в исходное (первое) окно.
java
selenium
selenium-webdriver
webdriver
new-window
Владимир Присяжнюк
источник
источник
Ответы:
Вы можете переключаться между окнами, как показано ниже:
// 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)
источник
getWindowHandles()
возвращает Set, а Set не гарантирует упорядочение . Последний элемент не всегда является последним окном. Я удивлен, что его комментарий получил много положительных отзывов.getWindowHandles()
. Это известное поведение (не ошибка) метода и, в частности, Java Set <T>. Следовательно,switchTo().window(handles[handles.length-1])
в Java это не гарантируется. Решение AC # не может считаться правильным.Просто чтобы добавить к содержанию ...
Чтобы вернуться в главное окно (окно по умолчанию).
использовать
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 } }
источник
Сурья, твой способ не сработает по двум причинам:
источник
Измените реестр для IE:
Источник: проблема переключения окон Selenium WebDriver в Internet Explorer 8-10
В моем случае IE начал обнаруживать новые дескрипторы окон после редактирования реестра.
Взято из блога MSDN:
Настройки интернета:
Код:
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>
не имеет гарантированного порядка в Java .WebDriverWait
как представляется, увеличивает шансы на успех, что подтверждается приведенным ниже утверждением.Цитата из Люка Инман-Семерау : (Разработчик Selenium)
Похожие сообщения:
источник
Вы можете использовать:
Где WindowName - это строка, представляющая имя окна, на которое вы хотите переключить фокус. Вызовите эту функцию еще раз с именем исходного окна, чтобы вернуться к нему, когда закончите.
источник
Я использую итератор и цикл 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); }
источник
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); } }
источник