【问题标题】:getWindowHandle() Selenium Webdriver JavascriptgetWindowHandle() Selenium Webdriver Javascript
【发布时间】:2019-10-10 22:03:13
【问题描述】:

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

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

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

我正在尝试做的事情:

  • 点击浏览器主窗口上的按钮
  • 将驱动程序切换到单击按钮后打开的第二个窗口
  • 在第二个窗口中执行操作
  • 关闭第二个窗口并返回第一个窗口。

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

【问题讨论】:

    标签: javascript selenium coffeescript


    【解决方案1】:
    var parent = driver.getWindowHandle();
    var windows = driver.getAllWindowHandles();
    
    driver.switchTo().window(windows[1]);
    
    // do some stuff
    
    driver.close();
    driver.switchTo().window(parent);
    

    【讨论】:

    • driver.getWindowHandles() 不是函数
    • 你确定吗?它仍然在 selenium 文档页面上被引用:seleniumhq.org/docs/03_webdriver.jsp selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…
    • 您正在查看 java 文档。在 JavaScript 中,正确的方法是 driver.getAllWindowHandles()
    • 谢谢@Jeremy-DeerAngel-org,几个小时以来一直在追我的尾巴
    • @JeremyMoritz 我认为必须更改接受的答案以反映这一点。不管怎样,你从哪里知道getAllWindowHandles。我可以找到任何包含节点功能列表的文档?
    【解决方案2】:

    你想要的是 driver.getAllWindowHandles(),但是因为这会返回一个 promise,所以请确保你使用了 then 函数内部的句柄

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

    【讨论】:

    • 嗨,我试过你的代码,但它说“getAllWindowHandles 不是 中的函数 ...”
    • @Ragnarsson 我不确定你的具体情况是怎么回事。知道这一点可能并不舒适,但它在我的机器上工作。不幸的是,我使用该代码已经两年了,所以我现在无法对其进行故障排除。 :-/
    • @Ragnarsson await driver.getAllWindowHandles().then(async (allhandles) => { return await driver.switchTo().window(allhandles[allhandles.length - 1]); });
    【解决方案3】:

    每当新标签页打开时,都需要一些时间来呈现和呈现。在这种情况下,很难切换选项卡,因为选项卡尚未打开,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。

    【讨论】:

    • 这太棒了:+1。两个或更多选项卡的情况如何?最新的选项卡将始终是最后一个选项卡。我做了些小改动:return await driver.wait(async function () { return await driver.getAllWindowHandles().then(async function (handles) { if (handles.length > 1) { return driver.switchTo().window(handles[handles.length - 1]); } return false; }); }).then(function () { });
    【解决方案4】:

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2016-09-16
      • 2013-02-06
      • 2013-01-12
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多