web-dev-qa-db-fra.com

Comment gérer la nouvelle fenêtre dans Selenium WebDriver en utilisant Java?

Ceci est mon code:

driver.findElement(By.id("ImageButton5")).click();
//Thread.sleep(3000);
String winHandleBefore = driver.getWindowHandle();
driver.switchTo().window(winHandleBefore);
driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219");

Maintenant, j'ai l'erreur suivante:

Exception dans le fil "principal" org.openqa.Selenium.NoSuchElementException: Impossible de trouver un élément avec id == txtEnterCptCode (AVERTISSEMENT: le serveur N'a fourni aucune information de pile) Durée de la commande ou délai d'attente: 404 millisecondes.

Des idées?

15
Arun Kumar

Il semble que vous ne basculiez pas dans une nouvelle fenêtre. Vous êtes censé obtenir le descripteur de fenêtre de votre fenêtre d'origine, le sauvegarder, puis récupérer le descripteur de fenêtre de la nouvelle fenêtre et basculer vers celui-ci. Une fois que vous avez terminé avec la nouvelle fenêtre, vous devez la fermer, puis revenir à la poignée de fenêtre d'origine. Voir mon exemple ci-dessous:

c'est à dire.

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
37
CODEBLACK

J'ai une méthode utilitaire pour passer à la fenêtre requise, comme indiqué ci-dessous

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;
        }
}

Cela vous mènera à la fenêtre désirée une fois que le titre de la fenêtre est passé en paramètre. Dans votre cas, vous pouvez faire.

Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow");

puis à nouveau passer à la fenêtre parente en utilisant la même méthode

Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");

Cette méthode fonctionne efficacement lorsque vous utilisez plusieurs fenêtres.

2
Abhishek Singh

J'ai un exemple de programme pour cela: 

classe publique 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();

}

}

0
Sathish D
                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);
                    }
                }
0
user3364839

j'avais quelques problèmes avec windowhandle et j'ai essayé celui-ci. celui-ci fonctionne bien pour moi. 

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); 
0
Golden Hash