J'ai la situation, lorsque vous cliquez sur le bouton ouvre la nouvelle fenêtre du navigateur avec les résultats de la recherche.
Est-il possible de se connecter et de se concentrer sur la nouvelle fenêtre du navigateur ouvert?
Et travaillez avec, puis revenez à la (première) fenêtre d'origine.
Vous pouvez basculer entre les fenêtres comme ci-dessous:
// 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)
Juste pour ajouter au contenu ...
Pour revenir à la fenêtre principale (fenêtre par défaut).
utiliser driver.switchTo().defaultContent();
Ce script vous aide à passer d'une fenêtre parent à une fenêtre enfant et à revenir à la fenêtre parent
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, ton chemin ne fonctionnera pas, pour deux raisons:
Source:Problème de commutation de fenêtres de Selenium WebDriver dans Internet Explorer 8-10
Dans mon cas, IE a commencé à détecter de nouveaux descripteurs de fenêtre après la modification du registre.
Croissance du processus Tab: Définit la vitesse à laquelle IE crée les processus Nouvel onglet.
L'algorithme "Max-Number": il spécifie le nombre maximal de processus de tabulation pouvant être exécutés pour une seule session d'isolement pour un processus de trame unique à un niveau d'intégrité obligatoire (MIC) spécifique. Les valeurs relatives sont:
- TabProcGrowth = 0: les onglets et les cadres sont exécutés dans le même processus; les cadres ne sont pas unifiés entre les niveaux MIC.
- TabProcGrowth = 1: tous les onglets d'un processus de trame donné sont exécutés dans un processus de tabulation unique pour un niveau MIC donné.
Source:L'ouverture d'un nouvel onglet peut lancer un nouveau processus avec Internet Explorer 8.0
Navigateur: IE11 x64 (Zoom: 100%)
OS: Windows 7 x64
Sélénium: 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);
Le code ci-dessus inclut un if-check pour vous assurer que vous ne passez pas à la fenêtre parente car Set<T>
n'a pas la garantie de commander en Java . WebDriverWait
semble augmenter les chances de succès, comme l'indique l'énoncé ci-dessous.
Le navigateur peut prendre du temps pour reconnaître la nouvelle fenêtre, et vous pouvez tomber dans votre boucle switchTo () avant que la fenêtre contextuelle apparaisse.
Vous supposez automatiquement que la dernière fenêtre est retournée par getWindowHandles () sera le dernier ouvert. Ce n'est pas nécessairement vrai, car ils ne sont pas garantis pour être retournés dans n'importe quel ordre.
J'utilise un itérateur et une boucle while pour stocker les différentes poignées de fenêtre, puis commuter d'avant en arrière.
//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);
}
Vous pouvez utiliser:
driver.SwitchTo().Window(WindowName);
Où WindowName est une chaîne représentant le nom de la fenêtre sur laquelle vous souhaitez activer le focus. Appelez cette fonction à nouveau avec le nom de la fenêtre d'origine pour y revenir lorsque vous avez terminé.
Donc, le problème avec beaucoup de ces solutions est que vous supposez que la fenêtre apparaît instantanément (rien ne se produit instantanément et les choses se passent beaucoup moins instantanément dans IE). De plus, vous supposez qu'il n'y aura qu'une fenêtre avant de cliquer sur l'élément, ce qui n'est pas toujours le cas. De plus, IE ne renverra pas les descripteurs de fenêtre dans un ordre prévisible. Je ferais donc ce qui suit.
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);
}