Commuta le tabs usando Selenium WebDriver con Java

Usando Selenium WebDriver con JAVA, sto cercando 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 tabs hanno la stessa maniglia della finestra a causa della quale non sono in grado di passare da una scheda all’altra.

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

Per favore aiutami come posso cambiare le tabs. OPPURE, come posso passare da una scheda all’altra senza utilizzare l’handle della finestra poiché l’handle della finestra è lo stesso di entrambe le tabs nel mio caso.

(Ho notato che quando apri diverse tabs nella stessa finestra, la maniglia della finestra rimane la stessa.)

psdbComponent.clickDocumentLink(); ArrayList tabs2 = new ArrayList (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.

Questa è 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 newTab = new ArrayList(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()); } 

C’è una differenza nel modo in cui il driver web gestisce windows diverse e come gestisce le diverse tabs.

Caso 1:
Nel caso ci siano più windows, 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 ci siano più tabs nella stessa finestra, allora c’è solo un handle di 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"); 

Il codice di esempio dettagliato può essere trovato qui:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

Lavorare

Presupposto : facendo clic su qualcosa sulla tua pagina web si apre una nuova scheda.

Usa 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 puoi tornare alla prima scheda di nuovo.

 new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform(); 
 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 

Spero ti sia di aiuto ..

La prima cosa che devi fare è aprire una nuova scheda e salvarne il 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 tabs = new ArrayList(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 tabulazione all’altra. Farlo solo cambiando le maniglie delle windows, non funzionerà sempre poiché la scheda su cui lavorerai, non sarà sempre a fuoco e il selenium fallirà di volta in volta. Come ho detto, è un po ‘problematico usare le chiavi, e javascript in realtà non supporta le tabs di commutazione, quindi ho usato gli avvisi per cambiare scheda e ha funzionato come un incantesimo:

 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(); } 
 driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB); 

Questo metodo aiuta a 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.

Con Selenium 2.53.1 usando firefox 47.0.1 come WebDriver in Java: non importa quante tabs ho aperto, “driver.getWindowHandles ()” restituirebbe solo un handle, quindi era imansible passare da una scheda all’altra.

Una volta iniziato a utilizzare Chrome 51.0, sono riuscito a ottenere tutti gli handle. Il codice seguente mostra come accedere a più driver e tabs 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 (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 (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ù tabs in più windows del browser.

Poiché driver.window_handles non è in ordine, una soluzione migliore è questa.

passare prima alla prima scheda usando il tasto di scelta rapida Control + X per passare alla scheda ‘x’ nella finestra del browser.

 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. 

Ho avuto un problema di recente, il link è stato aperto in una nuova scheda, ma il selenium si è focalizzato ancora sulla scheda iniziale.

Sto usando Chromedriver e l’unico modo per mettere a fuoco una scheda è stato per me usare switch_to_window() .

Ecco il codice Python:

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

Quindi il consiglio è di scoprire il nome della maniglia di cui hai bisogno, sono memorizzati come lista

 driver.window_handles 

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!

È un processo molto semplice: supponiamo di avere due tabs quindi è necessario prima chiudere la scheda corrente usando client.window(callback) perché il comando switch “passa al primo disponibile”. Quindi puoi facilmente cambiare scheda usando client.switchTab .

Un breve esempio di come passare da una scheda a un’altra in un browser (nel caso di una 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 Thread.sleep(2000) solo per avere un timeout per vedere passare tra le tabs.

Puoi usare CTRL + TAB per passare alla scheda successiva e CTRL + MAIUSC + TAB per passare alla scheda precedente.

Questo funzionerà per 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, "{"); 

Per ottenere gli handle della finestra padre.

 String parentHandle = driverObj.getWindowHandle(); public String switchTab(String parentHandle){ String currentHandle =""; Set win = ts.getDriver().getWindowHandles(); Iterator 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; } 

Risposta semplice che ha funzionato per me:

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

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

Ho usato il seguente codice per cambiare le tabs, 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); 
 protected void switchTabsUsingPartOfUrl(String platform) { String currentHandle = null; try { final Set 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"); } } 

Chiama questo metodo e passa il parametro una sottostringa dell’URL della scheda a cui vuoi passare

class pubblica 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 ids = driver.getWindowHandles(); Iterator 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 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 hyperlinksOfParent = driver.findElements(By.xpath("//a")); System.out.println("Total links " + hyperlinksOfParent.size()); } public static void waitForLoad(WebDriver driver) { ExpectedCondition pageLoadCondition = new ExpectedCondition() { public Boolean apply(WebDriver driver) { return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); } }; WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(pageLoadCondition); }