J'ai une situation, lorsque cliquez sur le bouton ouvre la nouvelle fenêtre du navigateur avec les résultats de la recherche.
Existe-t-il un moyen de se connecter et de se concentrer sur une nouvelle fenêtre de navigateur ouverte?
Et travaillez avec, puis revenez à la (première) fenêtre d'origine.
java
selenium
selenium-webdriver
webdriver
new-window
Volodymyr Prysiazhniuk
la source
la source
Réponses:
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)
la source
getWindowHandles()
renvoie un Set et un Set ne garantit pas l'ordre . Le dernier élément n'est pas toujours la dernière fenêtre. Je suis surpris que son commentaire reçoive beaucoup de votes positifs.getWindowHandles()
. C'est un comportement connu (pas un bug) de la méthode et du Java Set <T> en particulier. Par conséquent,switchTo().window(handles[handles.length-1])
n'est pas garanti en Java. La solution AC # ne peut pas être considérée comme correcte.Juste pour ajouter au contenu ...
Pour revenir à la fenêtre principale (fenêtre par défaut).
utilisation
driver.switchTo().defaultContent();
la source
Ce script vous aide à passer d'une fenêtre Parent à une fenêtre Enfant et à revenir cntrl à 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 } }
la source
Surya, votre façon de faire ne fonctionnera pas, pour deux raisons:
la source
Modifier le registre pour IE:
Source: Problème de commutation de fenêtres Selenium WebDriver dans Internet Explorer 8-10
Dans mon cas, IE a commencé à détecter de nouvelles poignées de fenêtre après la modification du registre.
Tiré du blog MSDN:
Options Internet:
Code:
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 comprend une vérification if pour vous assurer que vous ne passez pas à la fenêtre parente car
Set<T>
aucun ordre n'est garanti en Java .WebDriverWait
semble augmenter les chances de succès comme le soutient la déclaration ci-dessous.Cité de Luke Inman-Semerau : (Développeur pour Selenium)
Articles Similaires:
la source
Vous pouvez utiliser:
Où WindowName est une chaîne représentant le nom de la fenêtre vers laquelle vous souhaitez basculer le focus. Appelez à nouveau cette fonction avec le nom de la fenêtre d'origine pour y revenir lorsque vous avez terminé.
la source
J'utilise un itérateur et une boucle while pour stocker les différentes poignées de fenêtre, puis j'intervertis.
//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); }
la source
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); }
la source
Donc, le problème avec beaucoup de ces solutions est que vous supposez que la fenêtre apparaît instantanément (rien ne se passe instantanément, et les choses se passent beaucoup moins instantanément dans IE). De plus, vous supposez qu'il n'y aura qu'une seule fenêtre avant de cliquer sur l'élément, ce qui n'est pas toujours le cas. De plus, IE ne renverra pas les poignées 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(); }
la source
Si vous avez plus d'un navigateur (en utilisant 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); } }
la source