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).
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).
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)
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();
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
}
}
Surya, seu jeito não vai funcionar, por dois motivos:
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.
Crescimento do processo de guia: define a taxa em que o IE cria processos de nova guia.
O algoritmo "Max-Number": especifica o número máximo de processos de guia que podem ser executados para uma única sessão de isolamento para um único processo de quadro em um nível de integridade obrigatório específico (MIC). Os valores relativos são:
- TabProcGrowth = 0: tabs e frames rodam no mesmo processo; os quadros não são unificados nos níveis de MIC.
- TabProcGrowth = 1: todas as guias para um determinado processo de quadro são executadas em um único processo de guia para um determinado nível de MIC.
Fonte: Abrir uma nova guia pode lançar um novo processo com o Internet Explorer 8.0
Navegador: IE11 x64 (Zoom: 100%)
SO: Windows 7 x64
Selenium: 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);
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.
O navegador pode demorar para reconhecer a nova janela, e você pode estar entrando no loop switchTo () antes que a janela pop-up apareça.
Você assume automaticamente que a última janela retornada por getWindowHandles () será a última aberta. Isso não é necessariamente verdade, pois não há garantia de que serão devolvidos em qualquer ordem.
Fonte: não é possível lidar com um pop-up no IE, o controle não está sendo transferido para a janela pop-up
Você pode usar:
driver.SwitchTo().Window(WindowName);
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.
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);
}
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);
}
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();
}
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);
}
}