2012-10-04 19 views
41

Utilizzo di Selenium WebDriver con JAVA, Sto tentando di automatizzare una funzionalità in cui devo aprire una nuova scheda, fare alcune operazioni lì e tornare alla scheda precedente (Parent). Ho usato l'interruttore ma non funziona. E una cosa strana le due schede hanno la stessa maniglia della finestra a causa della quale non sono in grado di passare da una scheda all'altra.Schede di commutazione utilizzando Selenium WebDriver con Java

Tuttavia, quando sto provando con diverse finestre di Firefox funziona, ma per la scheda non funziona.

Please help me come posso cambiare le schede. OPPURE come posso passare da una scheda all'altra senza usare la maniglia della finestra poiché la maniglia della finestra è la stessa di entrambe le schede nel mio caso.

(I hanno osservato che quando si apre diverse schede nella stessa finestra, maniglia della finestra rimane lo stesso.)

+0

Penso 2 schede sono uguali a 2 finestre nella maggior parte dei casi –

risposta

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

Questo codice ha funzionato perfettamente per me. Provalo. Devi sempre cambiare il tuo driver in una nuova scheda, prima di fare qualcosa in una nuova scheda.

+0

Il codice sopra riportato funziona per me –

+2

Le schede non sono Windows. Immagino che non funzioni in Firefox. – Alex78191

+0

Questa risposta presuppone l'ordine in driver.getWindowHandles(). Questo metodo restituisce un Set e pertanto non garantisce alcun ordine a livello di contratto. Forse la tua implementazione di WebDriver sta restituendo un'implementazione Set che garantisce l'ordine, ma perché correre il rischio? –

6

lavoro intorno

Assunzione: Cliccando qualcosa sulla tua pagina web porta ad aprire una nuova scheda

Utilizzare sotto la logica per passare alla seconda scheda.

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

Allo stesso modo è possibile tornare di nuovo alla prima scheda.

+0

buon suggerimento ... – Buddha

+0

funziona solo su Chrome – Jury

0

Ho avuto un problema di recente, il collegamento è stato aperto in una nuova scheda, ma il selenio si è concentrato ancora sulla scheda iniziale.

Sto usando Chromedriver e l'unico modo per mettere a fuoco una scheda era per me usare switch_to_window().

Ecco il codice Python:

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

Così il suggerimento è quello di scoprire il nome della maniglia della finestra è necessario, questi vengono memorizzati come elenco in

driver.window_handles 
+3

essere molto, molto attenti durante l'indicizzazione nella collezione di maniglie delle finestre. Non vi è alcuna garanzia che queste maniglie siano presentate in qualsiasi ordine, e la prima finestra aperta potrebbe avere l'ultima maniglia della finestra nella lista restituita dal metodo 'getWindowhandles' (o il suo equivalente nella tua lingua). – JimEvans

16

Si tratta di una soluzione semplice per aprire una nuova scheda, cambiare l'attenzione su di essa, chiudere la scheda e tornare alla scheda precedente/originale:

@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()); 
} 
+0

Sto usando il driver chrome e in quello quando uso la riga "driver.switchTo(). Window (newTab.get (0));" una nuova finestra viene aperta insieme a una nuova scheda ... Qualche idea sul perché questo sta accadendo? – Lucy

+0

Non l'ho verificato, ma suppongo che sia la configurazione del browser. –

0

Ple vedi sotto:

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"); 

Spero che questo sia utile!

9

C'è una differenza nel modo in cui il driver Web gestisce finestre diverse e come gestisce le diverse schede.

Caso 1:
Nel caso in cui non ci sono più finestre, quindi il seguente codice può aiutare:

//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); 


Caso 2:
Nel caso in cui non ci sono più schede nella stessa finestra , quindi c'è solo una maniglia della finestra. Quindi il passaggio da una finestra all'altra mantiene il controllo nella stessa scheda.
In questo caso è più utile usare Ctrl + \ t (Ctrl + Tab) per passare da una scheda all'altra.

//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"); 

codice di esempio dettagliate possono essere trovate qui:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

+0

SI. Questa è la prima risposta che indica che esiste una sola maniglia della finestra e che non è la stessa di una scheda. Non so come funzionino anche le altre soluzioni. In che modo getWindowHandles ottiene l'elenco di schede per loro? Mi vengono solo le maniglie delle finestre in IE (lo so, IE, blech) – BClaydon

0

E 'un processo molto semplice: si supponga di avere due schede, quindi è necessario chiudere prima la scheda corrente utilizzando client.window(callback) perché l'interruttore comando "passa al primo disponibile". Quindi puoi passare facilmente alla scheda utilizzando client.switchTab.

3
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 

speriamo vi sia utile per voi ..

0

Un breve esempio di come passare tra le schede in un browser (nel caso in cui con una sola finestra):

// 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); 

scrivo solo per Thread.sleep(2000) avere un timeout per vedere il passaggio tra le schede.

È possibile utilizzare CTRL + TAB per passare alla scheda successiva e CTRL + MAIUSC + TAB per passare alla scheda precedente.

1
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB); 

Questo metodo consente di passare da una finestra all'altra. Il problema di restrizione con questo metodo è che può essere utilizzato solo tante volte finché non viene raggiunta la finestra richiesta. Spero che sia d'aiuto.

+0

Forse tra più schede? – Alex78191

1

Con selenio 2.53.1 utilizzando firefox 47.0.1 come WebDriver in Java: indipendentemente dal numero di schede aperte, "driver.getWindowHandles()" restituiva solo un handle, quindi era impossibile passare da una scheda all'altra.

Una volta iniziato a utilizzare Chrome 51.0, sono riuscito a ottenere tutte le maniglie. Il codice seguente mostra come accedere a più driver e schede multiple all'interno di ciascun driver.

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

Speriamo che questo ti dia una buona idea di come manipolare più schede in più finestre del browser.

0

Questo lavoro per il MacOS per Firefox e 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, "{"); 
2

La prima cosa che dovete fare è aprire una nuova scheda e salvarla dell'handle nome. Sarà meglio farlo usando javascript e non i tasti (ctrl + t) poiché le chiavi non sono sempre disponibili sui server di automazione. esempio:

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 seconda cosa che devi fare è passare da una scheda all'altra.Farlo solo cambiando le maniglie delle finestre, non funzionerà sempre poiché la scheda su cui lavorerai, non sarà sempre a fuoco e il selenio fallirà di volta in volta. Come ho detto, è un po 'problematico per utilizzare i tasti, e javascript in realtà non supporta le schede di commutazione, così ho usato gli avvisi per passare le schede e ha funzionato come un fascino:

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(); 
    } 
0

Per ottenere maniglie per finestra genitore.

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

semplice risposta che ha funzionato per me:

for (String handle1 : driver1.getWindowHandles()) { 
     System.out.println(handle1); 
     driver1.switchTo().window(handle1);  
} 
0

Il difetto con la risposta selezionata è che essa assume inutilmente ordine in webDriver.getWindowHandles(). Il metodo getWindowHandles() restituisce un Set, che non garantisce l'ordine.

Ho usato il seguente codice per cambiare scheda, che non presuppone alcun ordine.

String currentTabHandle = driver.getWindowHandle(); 
String newTabHandle = driver.getWindowHandles() 
     .stream() 
     .filter(handle -> !handle.equals(currentTabHandle)) 
     .findFirst() 
     .get(); 
driver.switchTo().window(newTabHandle); 
Problemi correlati