Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getWindowHandle()Selenium Webdriver Javascript_Javascript_Selenium_Coffeescript - Fatal编程技术网

getWindowHandle()Selenium Webdriver Javascript

getWindowHandle()Selenium Webdriver Javascript,javascript,selenium,coffeescript,Javascript,Selenium,Coffeescript,根据工程部的帮助进行了一些更改。下面是我用来抓取新窗口句柄的最后一个代码: localdriver = @driver @driver.getAllWindowHandles() .then (handles) -> localdriver.switchTo().window(handles[1]) 我目前正在运行一个使用SeleniumWebDriver、Mocha、Chai和Grunt的自动化堆栈。我正在用Coffeescript创建脚本,但是用Javascript回答我的问

根据工程部的帮助进行了一些更改。下面是我用来抓取新窗口句柄的最后一个代码:

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
我目前正在运行一个使用SeleniumWebDriver、Mocha、Chai和Grunt的自动化堆栈。我正在用Coffeescript创建脚本,但是用Javascript回答我的问题就可以了

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
我想做的是:

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
  • 单击主浏览器窗口上的按钮
  • 将驱动程序切换到单击按钮后打开的第二个窗口
  • 在第二个窗口中执行操作
  • 关闭第二个窗口并返回第一个窗口

我在互联网上搜索,寻找如何做到这一点的答案。几个月前我才开始学习所有这些东西,但我仍然在创作这些东西。我看到了很多Java和C+示例,但Javascript方面的示例并不多。任何人都可以提供一个如何使用Selenium Webdriver和Javascript为上述场景设置代码的示例吗?

您需要的是driver.getAllWindowHandles(),但由于这会返回一个承诺,请确保使用
then
函数中的句柄

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
var parent = driver.getWindowHandle();
var windows = driver.getAllWindowHandles();

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

// do some stuff

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

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

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
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的答案很好。
如果有三个或更多选项卡,情况会如何
最新选项卡将始终是最后一个选项卡

localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])
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

});


除非您在选项卡之间切换,否则上述操作将适用。
要移动下一个选项卡,请获取当前选项卡的
索引-1

驱动程序。getWindowHandles()不是一个函数,您确定吗?它仍然在selenium文档页面上引用:您正在查看java文档。在JavaScript中,正确的方法是
driver.getAllWindowHandles()
Thank you@Jeremy DeerAngel org,我一直在追查这方面的进展hours@JeremyMoritz我认为必须改变公认的答案以反映这一点。不管怎样,您是在哪里找到有关
getAllWindowHandles
的信息的。我可以找到任何包含此节点的函数列表的文档?嗨,我尝试了你的代码,但它说“getAllWindowHandles不是…”中的函数@Ragnarsson我不确定在你的特定情况下发生了什么。知道这一点可能不舒服,但它在我的机器上工作。不幸的是,我使用该代码已经两年了,所以现在无法对其进行故障排除:-/@Ragnarsson
await driver.getAllWindowHandles().then(异步(allhandles)=>{return await driver.switchTo().window(allhandles[allhandles.length-1]);})这太棒了:+1。两个或更多选项卡的情况如何?最新选项卡将始终是最后一个选项卡。我做了一些细微的更改:
return-await-driver.wait(异步函数(){return-await-driver.getAllWindowHandles().then(异步函数(handles){if(handles.length>1){return-driver.switchTo().window(handles[handles.length-1]);}return false;}然后(函数(){})
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
    localdriver.switchTo().window(handles[1])