pestaña - ¿Cómo se maneja la nueva ventana en Selenium WebDriver usando Java?
cambiar de ventana selenium (6)
Este es mi código:
driver.findElement(By.id("ImageButton5")).click();
//Thread.sleep(3000);
String winHandleBefore = driver.getWindowHandle();
driver.switchTo().window(winHandleBefore);
driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219");
Ahora tengo el siguiente error:
Excepción en el hilo "main" org.openqa.selenium.NoSuchElementException: no se puede encontrar el elemento con id == txtEnterCptCode (ADVERTENCIA: El servidor no proporcionó ninguna información de la pila) Duración o tiempo de espera del comando: 404 milisegundos.
¿Algunas ideas?
Parece que en realidad no estás cambiando a ninguna ventana nueva. Se supone que debes obtener el identificador de ventana de tu ventana original, guardar eso, luego obtener el identificador de ventana de la nueva ventana y cambiar a eso. Una vez que haya terminado con la nueva ventana, debe cerrarla, luego volver al manejador original de la ventana. Ver mi muestra a continuación:
es decir
String parentHandle = driver.getWindowHandle(); // get the current window handle
driver.findElement(By.xpath("//*[@id=''someXpath'']")).click(); // click some link that opens a new window
for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle (that''s your newly opened window)
}
//code to do something on new window
driver.close(); // close newly opened window when done with it
driver.switchTo().window(parentHandle); // switch back to the original window
Tengo un método de utilidad para cambiar a la ventana requerida como se muestra a continuación
public class Utility
{
public static WebDriver getHandleToWindow(String title){
//parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle.
WebDriver popup = null;
Set<String> windowIterator = WebDriverInitialize.getDriver().getWindowHandles();
System.err.println("No of windows : " + windowIterator.size());
for (String s : windowIterator) {
String windowHandle = s;
popup = WebDriverInitialize.getDriver().switchTo().window(windowHandle);
System.out.println("Window Title : " + popup.getTitle());
System.out.println("Window Url : " + popup.getCurrentUrl());
if (popup.getTitle().equals(title) ){
System.out.println("Selected Window Title : " + popup.getTitle());
return popup;
}
}
System.out.println("Window Title :" + popup.getTitle());
System.out.println();
return popup;
}
}
Te llevará a la ventana deseada una vez que el título de la ventana se pase como parámetro. En tu caso, puedes hacer.
Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow");
y luego cambiar de nuevo a la ventana primaria usando el mismo método
Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");
Este método funciona de manera efectiva cuando se trata de múltiples ventanas.
Tengo un programa de ejemplo para esto:
clase pública BrowserBackForward {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("http://seleniumhq.org/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//maximize the window
driver.manage().window().maximize();
driver.findElement(By.linkText("Documentation")).click();
System.out.println(driver.getCurrentUrl());
driver.navigate().back();
System.out.println(driver.getCurrentUrl());
Thread.sleep(30000);
driver.navigate().forward();
System.out.println("Forward");
Thread.sleep(30000);
driver.navigate().refresh();
}
}
string BaseWindow = driver.CurrentWindowHandle;
ReadOnlyCollection<string> handles = driver.WindowHandles;
foreach (string handle in handles)
{
if (handle != BaseWindow)
{
string title = driver.SwitchTo().Window(handle).Title;
Thread.Sleep(3000);
driver.SwitchTo().Window(handle).Title.Equals(title);
Thread.Sleep(3000);
}
}
Set<String> windows = driver.getWindowHandles();
Iterator<String> itr = windows.iterator();
//patName will provide you parent window
String patName = itr.next();
//chldName will provide you child window
String chldName = itr.next();
//Switch to child window
driver.switchto().window(chldName);
//Do normal selenium code for performing action in child window
//To come back to parent window
driver.switchto().window(patName);
Estaba teniendo algunos problemas con Windowhandle y probé este. este funciona bien para mi
String parentWindowHandler = driver.getWindowHandle();
String subWindowHandler = null;
Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
subWindowHandler = iterator.next();
driver.switchTo().window(subWindowHandler);
System.out.println(subWindowHandler);
}
driver.switchTo().window(parentWindowHandler);