在我看来 driver.getWindowHandles() 不适用于选项卡...您总是会返回一个带有当前选项卡句柄的单项数组... [删除旧答案,因为这似乎现在已修复]
更新(2016 年 6 月 16 日):当前版本的 Selenium(服务器独立 2.53.0)似乎表现不同。现在我正在使用这样的东西来打开/切换驱动程序到新标签:
更新(2016 年 11 月 16 日):Selenium 3.0.1 似乎又改变了一些事情?我现在必须使用 javascript 打开一个新标签。这似乎只在 Chrome 中有效...... Firefox 会打开一个新窗口。我将看看是否可以使用 geckodriver 的设置(功能/配置文件?)更改该行为。
// Actions actions = new Actions(driver);
// actions.keyDown(Keys.CONTROL).sendKeys("t").keyUp(Keys.CONTROL).build().perform();
((JavascriptExecutor)driver).executeScript("window.open('about:blank', '_blank');");
Set<String> tab_handles = driver.getWindowHandles();
int number_of_tabs = tab_handles.size();
int new_tab_index = number_of_tabs-1;
driver.switchTo().window(tab_handles.toArray()[new_tab_index].toString());
getWindowHandles() 方法现在返回一个 Set。到目前为止,这仅在 Chrome 中进行了测试,因为 Firefox 版本 47 目前在使用 firefoxdriver 时存在一些严重问题......并且使用 geckodriver 操作根本不起作用。 [2016 年 6 月 11 日更新]:Firefox 通过 geckodriver 现在返回一个 Set]
您也可以这样做.. 将其转换为 ArrayList:
// set tab_index to the number of window/tab you want. 0 is the first tab
ArrayList<String> tabs_windows = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs_windows.get(tab_index));
更新:为了解决 geckodriver 错误,我已切换到使用 element.sendkeys ......这样的东西似乎在 Marionette 和 Chrome 中工作。(更新 2):由于 Selenium 3.0 的变化而更新为 javascript。 1:
// driver.findElement(By.cssSelector("body")).sendKeys(Keys.chord(Keys.CONTROL, "t"));
((JavascriptExecutor)driver).executeScript("window.open('about:blank', '_blank');");
Set<String> tab_handles = driver.getWindowHandles();
int number_of_tabs = tab_handles.size();
int new_tab_index = number_of_tabs-1;
driver.switchTo().window(tab_handles.toArray()[new_tab_index].toString());
更新(2016 年 11 月 16 日):使用 Ctrl-W 关闭的旧方法似乎也被破坏了......使用这个:
((JavascriptExecutor)driver).executeScript("close();");