使用Selenium WebDriver切换选项卡与Java

使用Selenium WebDriver与JAVA,我试图自动化一个function,我必须打开一个新的选项卡做一些操作,并回到以前的选项卡(父)。 我用开关手柄,但它不工作。 而一个奇怪的事情是两个标签有相同的窗口句柄,由于我无法切换标签。

但是,当我尝试与不同的Firefox窗口它的作品,但选项卡不工作。

请帮助我如何切换标签。 或者我怎么可以切换标签,而不使用窗口句柄,因为窗口句柄是在我的情况下两个标签相同。

(我观察到,当你在同一窗口中打开不同的标签时,窗口句柄保持不变。)

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

这段代码完全适合我。 试试看。 您总是需要将您的驱动程序切换到新的选项卡,然后才能在新选项卡上执行某些操作。

这是一个简单的解决scheme,用于打开一个新的标签,改变焦点,closures标签并将焦点返回到旧的/原始的标签:

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

Web驱动程序如何处理不同的窗口以及如何处理不同的标签是有区别的。

情况1:
如果有多个窗口,那么下面的代码可以帮助:

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

案例2:
如果在同一窗口中有多个选项卡,则只有一个窗口句柄。 因此,在窗口句柄之间切换将控件保存在同一个选项卡中。
在这种情况下使用Ctrl + \ t(Ctrl + Tab)切换标签更有用。

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

详细的示例代码可以在这里find:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

解决办法

假设 :通过点击您的网页上的东西导致打开一个新的标签。

使用下面的逻辑切换到第二个选项卡。

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

以同样的方式,您可以再次切换回第一个选项卡。

 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 

希望对你有所帮助

你需要做的第一件事是打开一个新的标签并保存它的句柄名称。 最好使用javascript而不是键(ctrl + t),因为在自动化服务器上​​键并不总是可用的。 例:

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

你需要做的第二件事是切换标签。 只能通过切换窗口句柄进行操作,因为您将要使用的选项卡不会始终处于工作状态,Selenium将不时地失败。 正如我所说,使用按键有点麻烦,而且javascript并不真正支持切换标签,所以我使用警报来切换标签,它像一个魅力:

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

这种方法有助于在多个窗口之间切换。 这种方法的限制性问题是它只能使用很多次,直到达到所需的窗口。 希望它有帮助。

在Selenium 2.53.1中,使用firefox 47.0.1作为Java中的WebDriver:无论我打开多less个标签,“driver.getWindowHandles()”只会返回一个句柄,所以不可能在标签间切换。

一旦我开始使用Chrome 51.0,我可以得到所有的句柄。 以下代码显示了如何在每个驱动程序中访问多个驱动程序和多个选项卡。

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

希望这给你一个好主意,如何操纵多个浏览器窗口中的多个选项卡。

我最近遇到了一个问题,链接在新标签中打开,但selenium仍然集中在最初的标签上。

我使用的是Chromedriver,唯一能够关注的选项是我使用switch_to_window()

这里是Python代码:

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

所以提示是找出你需要的窗口句柄的名字,它们被存储在列表中

 driver.window_handles 

请参阅下文:

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

希望这是有帮助的!

这是一个非常简单的过程:假设您有两个选项卡,所以您需要先使用client.window(callback)closures当前选项卡,因为开关命令“切换到第一个可用选项”。 然后,您可以使用client.switchTab轻松切换选项卡。

如何在浏览器中切换标签页(在一个窗口的情况下)的简单示例:

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

我写Thread.sleep(2000)只是有一个超时看到切换标签。

您可以使用CTRL + TAB切换到下一个选项卡,使用CTRL + SHIFT + TAB切换到上一个选项卡。

这将适用于Firefox和Chrome的MacOS:

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

获取父窗口句柄。

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

简单的答案,为我工作:

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