Commutateur des onglets utilisant Selenium WebDriver avec Java

utilisant le WebDriver Selenium avec JAVA , J'essaie d'automatiser une fonctionnalité Où je dois ouvrir un nouvel onglet faire quelques opérations là-bas et revenir à l'onglet précédent (Parent). J'ai utilisé la poignée d'interrupteur mais ça ne marche pas. Et une chose étrange les deux onglets ont la même poignée de fenêtre en raison de laquelle je ne suis pas en mesure de basculer entre les onglets.

cependant quand je suis en train d'essayer avec différentes fenêtres de Firefox il fonctionne, mais pour tab il ne fonctionne pas.

S'il vous plaît, aidez-moi à changer les onglets. Ou comment puis-je changer les onglets sans utiliser la poignée de fenêtre comme la poignée de fenêtre est la même des deux onglets dans mon cas.

(j'ai observé que lorsque vous ouvrez des onglets différents dans une même fenêtre , la poignée de la fenêtre reste la même.)

46
demandé sur Ripon Al Wasim 2012-10-04 18:13:38

19 réponses

    psdbComponent.clickDocumentLink();
    ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs2.get(1));
    driver.close();
    driver.switchTo().window(tabs2.get(0));

Ce code a parfaitement fonctionné pour moi. De l'essayer. Vous avez toujours besoin de passer votre pilote à nouvel onglet, avant que vous voulez faire quelque chose sur Nouvel onglet.

75
répondu Sireesha Middela 2014-04-08 17:31:56

c'est une solution simple pour ouvrir un nouvel onglet, changer de focus, fermer l'onglet et retourner le focus à l'onglet ancien/original:

@Test
public void testTabs() {
    driver.get("https://business.twitter.com/start-advertising");
    assertStartAdvertising();

    // considering that there is only one tab opened in that point.
    String oldTab = driver.getWindowHandle();
    driver.findElement(By.linkText("Twitter Advertising Blog")).click();
    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
    newTab.remove(oldTab);
    // change focus to new tab
    driver.switchTo().window(newTab.get(0));
    assertAdvertisingBlog();

    // Do what you want here, you are in the new tab

    driver.close();
    // change focus back to old tab
    driver.switchTo().window(oldTab);
    assertStartAdvertising();

    // Do what you want here, you are in the old tab
}

private void assertStartAdvertising() {
    assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
}

private void assertAdvertisingBlog() {
    assertEquals("Twitter Advertising", driver.getTitle());
}
18
répondu Jordan Silva 2016-09-07 12:44:12

il y a une différence entre la façon dont le pilote web gère les différentes fenêtres et la façon dont il gère les différents onglets.



Cas 1:

Dans le cas où il y a plusieurs fenêtres, alors le code suivant peut aider:

//Get the current window handle
String windowHandle = driver.getWindowHandle();

//Get the list of window handles
ArrayList tabs = new ArrayList (driver.getWindowHandles());
System.out.println(tabs.size());
//Use the list of window handles to switch between windows
driver.switchTo().window(tabs.get(0));

//Switch back to original window
driver.switchTo().window(mainWindowHandle);



cas 2:

Dans le cas où il y a plusieurs onglets dans la même fenêtre, puis il ya seulement un la poignée de la fenêtre. D'où la commutation entre les poignées de fenêtre conserve la maîtrise dans le même onglet.

dans ce cas, utiliser Ctrl + \T (Ctrl + Tab) pour passer d'un onglet à l'autre est plus utile.

//Open a new tab using Ctrl + t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Switch between tabs using Ctrl + \t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
Le code d'échantillon détaillé

peut être trouvé ici:

http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

10
répondu Sourabh 2014-11-27 15:06:09

travaux autour de

supposition : en cliquant quelque chose sur votre page Web mène à ouvrir un nouvel onglet.

utilisez la logique ci-dessous pour passer au second onglet.

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();

de la même manière que vous pouvez revenir au premier onglet à nouveau.

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();
6
répondu Santoshsarma 2012-10-04 15:43:29
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
    WebElement e = driver.findElement(By
            .xpath("html/body/header/div/div[1]/nav/a"));
e.sendKeys(selectLinkOpeninNewTab);//to open the link in a current page in to the browsers new tab

    e.sendKeys(Keys.CONTROL + "\t");//to move focus to next tab in same browser
    try {
        Thread.sleep(8000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    //to wait some time in that tab
    e.sendKeys(Keys.CONTROL + "\t");//to switch the focus to old tab again

J'espère que ça vous aidera..

3
répondu Vishwak 2015-04-24 07:11:41

la première chose que vous devez faire est d'ouvrir un nouvel onglet et enregistrer son nom de poignée. Il est préférable de le faire en utilisant javascript et pas les clés(ctrl+t) car les clés ne sont pas toujours disponibles sur les serveurs d'automatisation. exemple:

public static String openNewTab(String url) {
    executeJavaScript("window.parent = window.open('parent');");
    ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
    String handleName = tabs.get(1);
    bot.driver.switchTo().window(handleName);
    System.setProperty("current.window.handle", handleName);
    bot.driver.get(url);
    return handleName;
}

La deuxième chose que vous devez faire est de basculer entre les onglets. Le faire par switch window handles seulement, ne fonctionnera pas toujours puisque l'onglet sur lequel vous travaillerez, ne sera pas toujours dans la mise au point et le sélénium échouera de temps en temps. Comme je l'ai dit, c'est un peu problématique d'utiliser des touches, et javascript ne supporte pas vraiment le changement d'onglet, donc j'ai utilisé des alertes pour changer d'onglet et ça a fonctionné comme un charme:

public static void switchTab(int tabNumber, String handleName) {
        driver.switchTo().window(handleName);
        System.setProperty("current.window.handle", handleName);
        if (tabNumber==1)
            executeJavaScript("alert(\"alert\");");
        else
            executeJavaScript("parent.alert(\"alert\");");
        bot.wait(1000);
        driver.switchTo().alert().accept();
    }
2
répondu Ed Ram 2016-10-19 12:55:30
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);

cette méthode permet de passer d'une fenêtre à l'autre. Le problème de restriction avec cette méthode est qu'elle ne peut être utilisée que plusieurs fois jusqu'à ce que la fenêtre requise soit atteinte. Espérons que cela aide.

1
répondu Anand Ramamurthy 2016-04-28 17:40:26

avec Selenium 2.53.1 en utilisant firefox 47.0.1 comme WebDriver en Java: peu importe combien d'onglets j'ai ouvert, "driver.getWindowHandles () " ne retournait qu'une poignée, il était donc impossible de passer d'un onglet à l'autre.

une fois que J'ai commencé à utiliser Chrome 51.0, je pouvais obtenir toutes les poignées. Le code suivant indique comment accéder à plusieurs pilotes et à plusieurs onglets dans chaque pilote.

// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());

// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());

// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   driver1.switchTo().window(tabs1.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   drvier2.switchTo().window(tabs2.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

avec un peu de chance, cela vous donne une bonne idée de la façon de manipuler plusieurs onglets dans plusieurs fenêtres de navigateur.

1
répondu Charles Woodson 2016-08-24 14:38:11

puisque le driver.window_handles n'est pas en ordre , une meilleure solution est celle-ci.

passez d'abord au premier onglet en utilisant le raccourci Control + X pour passer à l'onglet " x " dans la fenêtre du navigateur .

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "1");
# goes to 1st tab

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "4");
# goes to 4th tab if its exists or goes to last tab.
1
répondu Natesh bhat 2018-06-10 04:54:24

j'ai eu un problème récemment, le lien est ouvert dans un nouvel onglet, mais sélénium concentre toujours sur le premier onglet.

j'utilise Chromedriver et la seule façon de me concentrer sur un onglet était pour moi d'utiliser switch_to_window() .

voici le code Python:

driver.switch_to_window(driver.window_handles[-1])

donc la pointe est de trouver le nom de la poignée de fenêtre dont vous avez besoin, ils sont stockés dans la liste dans

driver.window_handles
0
répondu Kee 2013-04-29 05:00:29

s'il vous Plaît voir ci-dessous:

WebDriver driver = new FirefoxDriver();

driver.manage().window().maximize();
driver.get("https://www.irctc.co.in/");
String oldTab = driver.getWindowHandle();

//For opening window in New Tab
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("Hotels & Lounge")).sendKeys(selectLinkOpeninNewTab);

// Perform Ctrl + Tab to focus on new Tab window
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, Keys.TAB)).perform();

// Switch driver control to focused tab window
driver.switchTo().window(oldTab);

driver.findElement(By.id("textfield")).sendKeys("bangalore");

J'espère que c'est utile!

0
répondu Prashant 2014-01-31 12:05:20

c'est un processus très simple: supposons que vous avez deux onglets, vous devez donc d'abord fermer l'onglet courant en utilisant client.window(callback) parce que la commande switch"switches to the first available one". Ensuite, vous pouvez facilement basculer onglet en utilisant client.switchTab .

0
répondu Ravi Ubana 2015-04-14 06:45:51

un bref exemple de comment passer d'un onglet à l'autre dans un navigateur (dans le cas d'une fenêtre unique):

// open the first tab
driver.get("https://www.google.com");
Thread.sleep(2000);

// open the second tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
driver.get("https://www.google.com");
Thread.sleep(2000);

// switch to the previous tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "" + Keys.SHIFT + "" + Keys.TAB);
Thread.sleep(2000);

j'écris Thread.sleep(2000) juste pour avoir un délai d'attente pour voir basculer entre les onglets.

vous pouvez utiliser CTRL+TAB pour passer à l'onglet suivant et CTRL+SHIFT+TAB pour passer à l'onglet précédent.

0
répondu Stas 2016-04-26 15:38:32

cela fonctionnera pour les MacOS pour Firefox et Chrome:

// opens the default browser tab with the first webpage
driver.get("the url 1");
thread.sleep(2000);

// opens the second tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
driver.get("the url 2");
Thread.sleep(2000);

// comes back to the first tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");
0
répondu ramy 2016-09-08 11:26:16

pour obtenir des poignées de fenêtre parent.

String parentHandle = driverObj.getWindowHandle();
public String switchTab(String parentHandle){
    String currentHandle ="";
    Set<String> win  = ts.getDriver().getWindowHandles();   

    Iterator<String> it =  win.iterator();
    if(win.size() > 1){
        while(it.hasNext()){
            String handle = it.next();
            if (!handle.equalsIgnoreCase(parentHandle)){
                ts.getDriver().switchTo().window(handle);
                currentHandle = handle;
            }
        }
    }
    else{
        System.out.println("Unable to switch");
    }
    return currentHandle;
}
0
répondu Ankit Gupta 2017-08-09 06:45:16

réponse Simple qui a fonctionné pour moi:

for (String handle1 : driver1.getWindowHandles()) {
        System.out.println(handle1); 
        driver1.switchTo().window(handle1);     
}
0
répondu Omar Lari 2017-10-09 19:52:33

le défaut avec la réponse choisie est qu'elle assume inutilement l'ordre dans webDriver.getWindowHandles() . La méthode getWindowHandles() renvoie une Set , qui ne garantit pas la commande.

j'ai utilisé le code suivant pour changer les onglets, ce qui ne suppose aucune commande.

String currentTabHandle = driver.getWindowHandle();
String newTabHandle = driver.getWindowHandles()
       .stream()
       .filter(handle -> !handle.equals(currentTabHandle ))
       .findFirst()
       .get();
driver.switchTo().window(newTabHandle);
0
répondu The Gilbert Arenas Dagger 2018-02-28 11:21:51
protected void switchTabsUsingPartOfUrl(String platform) {
    String currentHandle = null;
    try {
        final Set<String> handles = driver.getWindowHandles();
        if (handles.size() > 1) {
            currentHandle = driver.getWindowHandle();
        }
        if (currentHandle != null) {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
                    break;
                }
            }
        } else {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform)) {
                    break;
                }
            }
        }
    } catch (Exception e) {
        System.out.println("Switching tabs failed");
    }
}

appelez cette méthode et passez le paramètre une soustraction de l'url de l'onglet que vous voulez passer à

0
répondu Rahul Rana 2018-03-15 09:45:31

public class TabBrowserDemo {

public static void main(String[] args) throws InterruptedException {
    System.out.println("Main Started");
    System.setProperty("webdriver.gecko.driver", "driver//geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.irctc.co.in/eticketing/userSignUp.jsf");
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    driver.findElement(By.xpath("//a[text()='Flights']")).click();
    waitForLoad(driver);
    Set<String> ids = driver.getWindowHandles();
    Iterator<String> iterator = ids.iterator();
    String parentID = iterator.next();
    System.out.println("Parent WIn id " + parentID);
    String childID = iterator.next();
    System.out.println("child win id " + childID);

    driver.switchTo().window(childID);
    List<WebElement> hyperlinks = driver.findElements(By.xpath("//a"));

    System.out.println("Total links in tabbed browser " + hyperlinks.size());

    Thread.sleep(3000);
//  driver.close();
    driver.switchTo().window(parentID);
    List<WebElement> hyperlinksOfParent = driver.findElements(By.xpath("//a"));

    System.out.println("Total links " + hyperlinksOfParent.size());

}

public static void waitForLoad(WebDriver driver) {
    ExpectedCondition<Boolean> pageLoadCondition = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
                }
            };
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(pageLoadCondition);
}
0
répondu Aravind HB 2018-06-25 07:28:27