Mam sytuację, gdy kliknięcie przycisku otwiera nowe okno przeglądarki z wynikami wyszukiwania.
Czy jest jakiś sposób na połączenie się i skupienie się na nowo otwartym oknie przeglądarki?
Pracuj z nim, a następnie wróć do oryginalnego (pierwszego) okna.
java
selenium
selenium-webdriver
webdriver
new-window
Volodymyr Prysiazhniuk
źródło
źródło
Odpowiedzi:
Możesz przełączać się między oknami, jak poniżej:
// 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)
źródło
getWindowHandles()
zwraca zestaw, a zestaw nie gwarantuje zamówienia . Ostatni element nie zawsze jest ostatnim oknem. Dziwię się, że jego komentarz spotkał się z wieloma pozytywnymi opiniami.getWindowHandles()
. Jest to znane zachowanie (nie błąd) metody, aw szczególności Java Set <T>. DlategoswitchTo().window(handles[handles.length-1])
nie jest gwarantowane w Javie. Nie można twierdzić, że rozwiązanie AC # jest poprawne.Wystarczy dodać do treści ...
Powrót do okna głównego (okno domyślne).
posługiwać się
driver.switchTo().defaultContent();
źródło
Ten skrypt pomaga ci przełączać się z okna nadrzędnego do okna podrzędnego iz powrotem cntrl do okna nadrzędnego
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 } }
źródło
Surya, twój sposób nie zadziała z dwóch powodów:
źródło
Zmodyfikuj rejestr dla IE:
Źródło: Problem z przełączaniem okien Selenium WebDriver w przeglądarce Internet Explorer 8-10
W moim przypadku IE zaczął wykrywać nowe uchwyty okien po edycji rejestru.
Zaczerpnięte z bloga MSDN:
Opcje internetowe:
Kod:
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);
Powyższy kod zawiera sprawdzenie, czy nie przechodzisz do okna nadrzędnego, ponieważ
Set<T>
nie ma gwarantowanej kolejności w Javie .WebDriverWait
wydaje się zwiększać szansę na sukces, co potwierdza poniższe stwierdzenie.Cytat z Luke Inman-Semerau : (Developer for Selenium)
Powiązane posty:
źródło
Możesz użyć:
Gdzie WindowName to ciąg reprezentujący nazwę okna, na które chcesz przełączyć fokus. Wywołaj tę funkcję ponownie, podając nazwę oryginalnego okna, aby wrócić do niego po zakończeniu.
źródło
Używam iteratora i pętli while do przechowywania różnych klamek okiennych, a następnie przełączam się tam iz powrotem.
//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); }
źródło
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); }
źródło
Więc problem z wieloma z tych rozwiązań polega na tym, że zakładasz, że okno pojawia się natychmiast (nic nie dzieje się natychmiast, a rzeczy dzieją się znacznie rzadziej w IE). Zakładasz również, że przed kliknięciem elementu będzie tylko jedno okno, co nie zawsze ma miejsce. IE nie zwróci również klamek okien w przewidywalnej kolejności. Więc zrobiłbym co następuje.
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(); }
źródło
Jeśli masz więcej niż jedną przeglądarkę (używając 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); } }
źródło