2012-10-04 51 views
41

使用Selenium WebDriver與JAVA, 我試圖自動化一個功能,我必須打開一個新選項卡並在那裏執行一些操作並返回到之前的選項卡(Parent)。 我用開關手柄,但它不工作。 這兩個標籤有一個奇怪的東西是有相同的窗口句柄,由於我無法切換標籤。使用Selenium WebDriver切換選項卡與Java

但是,當我嘗試使用不同的Firefox窗口它的作品,但對於製表符不工作。

請幫我我如何切換標籤。 或者我如何切換標籤而不使用窗口句柄,因爲在我的情況下窗口句柄和兩個標籤都是一樣的。

(我觀察到,當你打開在同一窗口不同的標籤,窗口句柄保持不變。)

+0

我覺得2個選項卡一樣在大多數情況下,2個窗口 –

回答

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

此代碼完全爲我工作。試試看。在您想要在新選項卡上執行操作之前,您總是需要將您的驅動程序切換到新選項卡。

+0

上面的代碼適用於我 –

+2

選項卡不是窗口。我想這不適用於Firefox。 – Alex78191

+0

此答案假設在driver.getWindowHandles()中的順序。該方法返回一個Set,因此保證合同級別沒有訂單。也許你的WebDriver實現返回一個確保訂單的Set實現,但爲什麼要冒這個風險? –

6

解決方法

假設:通過您的網頁上點擊的東西導致開一個新標籤。

使用下面的邏輯切換到第二個選項卡。

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

很好的建議......只在Chrome – Buddha

+0

作品 – Jury

0

我最近有一個問題,鏈接在新標籤中打開,但硒仍然集中在最初的選項卡上。

我使用的是Chromedriver,唯一專注於選項卡的方式是使用switch_to_window()

這裏的Python代碼:

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

所以,技巧是找出你需要的窗口句柄的名字,他們被存儲爲列表

driver.window_handles 
+3

索引到窗口句柄的收集時要非常,非常小心。不能保證這些句柄是以任何順序呈現的,並且打開的第一個窗口可能會在'getWindowhandles'方法(或其語言中的等價物)返回的列表中顯示最後一個窗口句柄。 – JimEvans

16

這是一個簡單的解決方案打開一個新標籤頁,將焦點改爲它,關閉標籤頁並將焦點返回到舊/原始標籤頁:

@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

我使用的是chrome驅動程序,當我使用行「driver.switchTo()。window(newTab.get(0));」一個新的窗口隨着一個新的標籤打開......任何想法爲什麼發生這種情況? – Lucy

+0

我還沒有檢查過它,但我想這是瀏覽器配置。 –

0

Ple請參閱以下內容:

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

希望這對您有所幫助!

9

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

詳細示例代碼可以在這裏找到:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

+0

是的。這是第一個響應,表示只有一個窗口句柄,並且與選項卡不同。我不知道其他解決方案如何工作。 getWindowHandles如何獲得他們的標籤列表?它只在IE中獲取窗口句柄(我知道,IE,blech) – BClaydon

0

這是一個非常簡單的過程:假設你有兩個標籤,所以你需要使用client.window(callback)因爲開關先關閉當前標籤頁命令「切換到第一個可用的」。然後,您可以使用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 

希望它可以幫助到你..

0

如何標籤之間的瀏覽器(帶有一個窗口的情況下)開關一個簡單的例子:

// 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切換到上一個選項卡。

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

該方法有助於在多個窗口之間切換。這種方法的限制性問題是它只能使用很多次,直到達到所需的窗口。希望能幫助到你。

+0

也許在多個標籤之間? – Alex78191

1

在Selenium 2.53.1中使用firefox 47.0.1作爲Java中的WebDriver:無論我打開多少個標籤,「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 
} 

希望,讓你如何操縱多個瀏覽器窗口的多個選項卡是一個好主意。

0

這將爲MacOS的Firefox和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

你需要做的就是打開一個新的標籤,並保存它的第一件事就是處理名稱。最好使用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(); 
    } 
0

要得到父窗口的句柄。

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

簡單的答案這工作對我來說:

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

與所選答案的缺陷是它不必要地webDriver.getWindowHandles()假定順序。 getWindowHandles()方法返回一個Set,它不保證順序。

我使用下面的代碼來更改選項卡,它不承擔任何順序。

String currentTabHandle = driver.getWindowHandle(); 
String newTabHandle = driver.getWindowHandles() 
     .stream() 
     .filter(handle -> !handle.equals(currentTabHandle)) 
     .findFirst() 
     .get(); 
driver.switchTo().window(newTabHandle); 
相關問題