web-dev-qa-db-fra.com

Manipulation d'une fenêtre contextuelle à l'aide de sélénium

Dans certaines circonstances, le fait de cliquer sur une page Web de lien ouvre une fenêtre contextuelle. Et après l'ouverture de la fenêtre contextuelle, le focus est dans la fenêtre contextuelle et la fenêtre principale est désactivée. Et je ne parviens pas à transférer le contrôle dans la fenêtre contextuelle. Veuillez regarder le code suivant.

driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens.

System.out.println("After Clicking me"); // After the popup window opens this line of code is never executed.

Je ne parviens pas à transférer le contrôle de la fenêtre parente à la fenêtre contextuelle. Je suis au courant de la commande suivante.

driver.switchTo().window("popup window");

Mais ce n'est pas aider beaucoup. Aidez-moi, s'il vous plaît.

7
coolswastik

C’est un code que j’utilise lorsque j’ai besoin de travailler avec une fenêtre contextuelle suivante, de la fermer et de revenir à ma fenêtre principale. Bien sûr, cela a été simplifié aux fins de cette réponse. Il conserve une poignée de la fenêtre d'origine (principale) afin qu'il puisse faire la différence entre les autres.

Cela nécessite un WebDriverWait explicite car, au cours du développement, le code a été exécuté avant que la fenêtre ne soit réellement ouverte.

function manipulatePopUp(final WebDriver driver, final WebDriverWait wait) {
    final String mainWindowHandle = driver.getWindowHandle();
    driver.findElement(By.id("linkThatOpensPopUp")).click();

    wait.until(new ExpectedConditions<Boolean>() {
        @Override
        public Boolean apply(WebDriver d) {
            return (d.getWindowHandles().size() != 1);
        }
    });

    for (String activeHandle : driver.getWindowHandles()) {
        if (!activeHandle.equals(mainWindowHandle)) {
            driver.switchTo().window(activeHandle);
        }
    }

    driver.close();
    driver.switchTo().window(mainWindowHandle);
}
8
aimbire

driver.findElement (By.linkText ("Cliquez sur moi")). click (); // lorsque cette ligne de code est atteinte, une fenêtre contextuelle s'ouvre.

System.out.println ("Après m'avoir cliqué"); // Après l'ouverture de la fenêtre , Cette ligne de code n'est jamais exécutée.

La ligne de code n'est jamais exécutée car le processus attend le traitement de la fenêtre contextuelle.

getWindowHandles () fonctionne correctement dans cette situation. 

Exemple: 

//handle of the master window before clicking the link
String master = driver.getWindowHandle();

driver.findElement(By.linkText("Click me")).click();

//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop.
int timeCount = 1;

do
{
   driver.getWindowHandles();
   Thread.sleep(200);
   timeCount++;
   if ( timeCount > 50 ) 
   {
       break;
   }
}
while ( driver.getWindowHandles().size == 1 );

//Assigning the handles to a set
Set<String> handles = driver.getWindowHandles();
//Switching to the popup window.
for ( String handle : handles )
{
    if(!handle.equals(master))
    {
         driver.switchTo().window(handle);
    }
}

Maintenant, le pilote est basculé vers la fenêtre contextuelle. Si la fenêtre contextuelle comporte un cadre, vous devez basculer sur ce dernier avant d’identifier les éléments qui s’y trouvent. 

9
Code Enthusiastic
public class socialSignOn extends masterBaseClassNewSiteStage {

    @Test
    public void testSocialSignOn() throws Throwable {
        openParticularUrl("/my-lfc/join/user-details?user_type=free");

        driver.findElement(By.cssSelector("#socialSignOn > div.left.socialLogin.googleButton")).click();

        String MainWindow = driver.getWindowHandle();

        for (String activeHandle : driver.getWindowHandles()) {
            if (!activeHandle.equals(MainWindow)) {
                driver.switchTo().window(activeHandle);
            }
        }
        driver.findElement(By.cssSelector("#Email")).sendKeys("");
        driver.findElement(By.cssSelector("#next")).click();
        pauseFiveSeconds();
        driver.findElement(By.cssSelector("#Passwd")).sendKeys("");
        driver.findElement(By.cssSelector("#signIn")).click();
        pauseOneSecond();
        driver.switchTo().window(MainWindow);
        pauseTenSeconds();
        closeDriver();
    }
}
0
Danny