Tenho situação, ao clicar no botão abre uma nova janela do navegador com os resultados da pesquisa.
Existe alguma maneira de conectar e focar na nova janela do navegador aberta?
E trabalhe com ele e, em seguida, volte à janela original (primeira).
java
selenium
selenium-webdriver
webdriver
new-window
Volodymyr Prysiazhniuk
fonte
fonte
Respostas:
Você pode alternar entre as janelas conforme abaixo:
// 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)
fonte
getWindowHandles()
retorna um Conjunto e um Conjunto não garante o pedido . O último elemento nem sempre é a última janela. Estou surpreso que seu comentário tenha muitos votos positivos.getWindowHandles()
. É um comportamento conhecido (não bug) do método e do Java Set <T> em particular. Portanto,switchTo().window(handles[handles.length-1])
não é garantido em Java. A solução AC # não pode ser considerada correta.Só para adicionar ao conteúdo ...
Para voltar à janela principal (janela padrão).
usar
driver.switchTo().defaultContent();
fonte
Este script ajuda você a mudar de uma janela pai para uma janela filho e voltar a usar o Ctrl para a janela pai
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 } }
fonte
Surya, seu jeito não vai funcionar, por dois motivos:
fonte
Modifique o registro para o IE:
Fonte: Problema de troca de janelas Selenium WebDriver no Internet Explorer 8-10
No meu caso, o IE começou a detectar novos identificadores de janela após a edição do registro.
Retirado do Blog do MSDN:
Opções de Internet:
Código:
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);
O código acima inclui um if-check para garantir que você não está alternando para a janela pai, pois
Set<T>
não há ordenação garantida em Java .WebDriverWait
parece aumentar a chance de sucesso, conforme comprovado pela declaração abaixo.Citado de Luke Inman-Semerau : (Desenvolvedor para Selenium)
Postagens relacionadas:
fonte
Você pode usar:
Onde WindowName é uma string que representa o nome da janela para a qual você deseja mudar o foco. Chame essa função novamente com o nome da janela original para voltar a ela quando terminar.
fonte
Eu uso o iterador e um loop while para armazenar as várias alças de janela e, em seguida, alterno entre um e outro.
//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); }
fonte
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); }
fonte
Portanto, o problema com muitas dessas soluções é que você está assumindo que a janela aparece instantaneamente (nada acontece instantaneamente, e as coisas acontecem significativamente menos instantaneamente no IE). Além disso, você está assumindo que haverá apenas uma janela antes de clicar no elemento, o que nem sempre é o caso. Além disso, o IE não retornará as alças das janelas em uma ordem previsível. Então, eu faria o seguinte.
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(); }
fonte
Se você tiver mais de um navegador (usando 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); } }
fonte