getWindowHandle() Selenium Webdriver Javascript

getWindowHandle() Selenium Webdriver Javascript

在工程师的帮助下进行了一些更改。这是我用于获取新 window 句柄的最终代码:

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])

我目前 运行 是一个使用 Selenium Webdriver、Mocha、Chai 和 Grunt 的自动化堆栈。我在 Coffeescript 中创建脚本,但在 Javascript 中回答我的问题就完全没问题了。

我想做什么:

我在互联网上搜索以寻找有关如何执行此操作的答案。几个月前才开始学习所有这些东西,但我仍然在创造东西时跌跌撞撞。我看到了很多 Java 和 C+ 示例,但在 Java 脚本方面并不多。谁能提供一个示例,说明如何使用 Selenium Webdriver 和 Javascript 为上述场景设置代码?

var parent = driver.getWindowHandle();
var windows = driver.getAllWindowHandles();

driver.switchTo().window(windows[1]);

// do some stuff

driver.close();
driver.switchTo().window(parent);

您想要的是 driver.getAllWindowHandles(),但因为这是 returns 承诺,请确保您随后使用 then 函数内部的句柄

// select the newly opened window
driver.getAllWindowHandles().then(function gotWindowHandles(allhandles) {
    driver.switchTo().window(allhandles[allhandles.length - 1]);
});

每当打开新标签页时,都需要一些时间来显示和呈现。在这种情况下,很难切换选项卡,因为选项卡尚未打开并且 driver.getAllWindowHandles() 不会为该选项卡提供处理程序。我以这种方式解决了这个问题,我假设我有一个打开的选项卡并单击某个按钮,我正在打开新的第二个选项卡。

function openNewTab(driver) {
  driver.wait(function () {
    return driver.getAllWindowHandles().then(function (handles) {
      var isHandleCount2 = (handles.length == 2);
      if (isHandleCount2) {
        driver.switchTo().window(handles[1]);
      }
      return isHandleCount2;
    });
  }).then(function () {
  // Now do some stuff in new tab
    var buttonElement = driver.wait(until.elementLocated(By.xpath("//td[*//span[text()='Click me']]")));
    buttonElement.click();
  });
} 

此代码将等待,直到句柄或制表符的数量不等于 2。

@Jai Prak 的回答很精彩。
三个或更多选项卡的情况呢?
最新的标签永远是最后一个标签。

return await driver.wait(async function () {
    return await driver.getAllWindowHandles().then(async function (handles) {
       // var isHandleCount2 = (handles.length == 2);
        if (handles.length > 1) {
            return driver.switchTo().window(handles[handles.length - 1]);
        }
        return false;
    });
}).then(function () {
    // Now do some stuff in new tab

});


除了在选项卡之间切换的情况外,以上内容将适用。
要移动下一个选项卡,请获取当前选项卡的 index -1