Ich habe eine Situation, wenn das Klicken auf die Schaltfläche das neue Browserfenster mit den Suchergebnissen öffnet.
Gibt es eine Möglichkeit, eine Verbindung herzustellen und sich auf ein neues geöffnetes Browserfenster zu konzentrieren?
Arbeiten Sie damit und kehren Sie dann zum ursprünglichen (ersten) Fenster zurück.
Sie können zwischen den Fenstern wie folgt wechseln:
// 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)
Einfach zum Inhalt hinzufügen ...
Rückkehr zum Hauptfenster (Standardfenster).
benutze driver.switchTo().defaultContent();
Dieses Skript hilft Ihnen beim Umschalten von einem Parent-Fenster zu einem Child-Fenster und zurück zum cntrl-Fenster zum Parent-Fenster
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
}
}
Surya, dein Weg wird aus zwei Gründen nicht funktionieren:
Source:Problem mit dem Windows-Wechsel des Selenium WebDriver in Internet Explorer 8-10
In meinem Fall hat IE nach der Registrierungsbearbeitung neue Fenstergriffe erkannt.
Tab Process Growth: Legt die Rate fest, mit der IE New Tab-Prozesse erstellt.
Der "Max-Number" -Algorithmus: Dies gibt die maximale Anzahl von Tabulatorprozessen an, die für eine einzelne Isolationssitzung für einen einzelnen Frame-Prozess auf einer bestimmten obligatorischen Integritätsstufe (MIC) ausgeführt werden dürfen. Relative Werte sind:
- TabProcGrowth = 0: Registerkarten und Frames werden innerhalb desselben Prozesses ausgeführt. Frames werden nicht auf MIC-Ebenen vereinheitlicht.
- TabProcGrowth = 1: Alle Registerkarten für einen bestimmten Frame-Prozess werden in einem einzigen Tab-Prozess für eine bestimmte MIC-Ebene ausgeführt.
Browser: IE11 x64 (Zoom: 100%)
OS: Windows 7 x64
Selen: 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);
Der obige Code enthält eine If-Check-Funktion, um sicherzustellen, dass Sie nicht zum übergeordneten Fenster wechseln, da Set<T>
keine garantierte Reihenfolge in Java hat. WebDriverWait
scheint die Erfolgschance zu erhöhen, wie dies durch die folgende Aussage unterstützt wird.
Es kann einige Zeit dauern, bis der Browser das neue Fenster bestätigt, und Sie können fallen in Ihre switchTo () - Schleife, bevor das Popup-Fenster angezeigt wird.
Sie gehen automatisch davon aus, dass das letzte Fenster von .__ zurückgegeben wurde. getWindowHandles () wird der zuletzt geöffnete sein. Das ist nicht unbedingt wahr, da sie nicht garantiert in jeder Bestellung zurückgegeben werden.
Source:Kann ein Popup im IE nicht verarbeiten, die Steuerung überträgt sich nicht in das Popup-Fenster
Ich verwende Iterator und eine while-Schleife, um die verschiedenen Fenstergriffe zu speichern und dann hin und her zu wechseln.
//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);
}
Du könntest benutzen:
driver.SwitchTo().Window(WindowName);
Dabei ist WindowName eine Zeichenfolge, die den Namen des Fensters darstellt, in das Sie den Fokus umschalten möchten. Rufen Sie diese Funktion erneut mit dem Namen des ursprünglichen Fensters auf, um wieder darauf zuzugreifen.
Das Problem bei vielen dieser Lösungen ist daher, dass Sie davon ausgehen, dass das Fenster sofort angezeigt wird (es passiert nichts sofort und die Dinge passieren im IE wesentlich weniger). Sie gehen auch davon aus, dass es vor dem Klicken auf das Element nur ein Fenster gibt, was nicht immer der Fall ist. Auch IE gibt die Fenstergriffe nicht in einer vorhersagbaren Reihenfolge zurück. Also würde ich folgendes tun.
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();
}
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);
}