【问题标题】:Switching to new window with Selenium/Protractor Javascript使用 Selenium/Protractor Javascript 切换到新窗口
【发布时间】:2015-05-01 12:35:48
【问题描述】:

寻求一些帮助,了解我应该如何获得一个新的“弹出”窗口,该窗口在我单击“登录”按钮后触发显示。

我能够到达窗口何时显示,但我不相信我当前用于抓取窗口“句柄”的代码工作正常。我的情况有点不同,因为我在我的页面中使用量角器,但是出现的新窗口不是基于角度的,所以当我在那个窗口中时,我必须切换到只使用 selenium WebDriver。 (有人知道这种方法是否存在问题?)

您可以在下面找到我用来创建 selenium 驱动程序的代码 sn-p,以及尝试“切换到/抓取句柄”弹出的新窗口的代码。我知道它无法正常工作,因为在尝试在页面上查找表单之后的代码中不断收到“没有这样的元素”错误。

    // Create selenium webdriver / driver
    var webdriver = require('selenium-webdriver');

    var driver = new webdriver.Builder().
        withCapabilities(webdriver.Capabilities.chrome()).
        build();

  // Now make sure that the new window is popping up and we are navigating   correctly to it
      var handlePromise = browser.driver.getAllWindowHandles();
      handlePromise.then(function (handles) {
        // parentHandle = handles[0];
        var popUpHandle = handles[1];

        // Change to new handle
        browser.driver.switchTo().window(popUpHandle);

        var popUpHandleFinal = browser.driver.getWindowHandle();
        expect(popUpHandleFinal).toEqual(popUpHandle);
    });

关于这个的几件事:

  1. 如果我删除“browser.driver.switchTo().window(popUpHandle)”行中的“浏览器”,因此它会显示为“driver.switchTo().window(popUpHandle)”读取为“UnknownError:未知错误:'name'必须是非空字符串”的错误在对此进行一些搜索后,这是因为驱动程序上的“switchTo()”方法不能为空。如果我只使用上面显示的代码,这个错误就会被清除。

  2. 我不能 100% 确定我应该使用量角器(全局“浏览器”变量)还是使用在此之前设置的直接“驱动程序”(Selenium)作为获取窗口的方式。

感谢您的帮助

【问题讨论】:

  • 可能与某事有关:stackoverflow.com/questions/28511013/….
  • 如果您已经在工作量角器驱动程序的上下文中,则无需在内部启动单独的 webdriver-instance。 (这可能会使浏览器混淆有两个遥控器)。 Protractor 通过browser.driver 公开其使用的原始网络驱动程序,因此应该可以正确使用。
  • 这是我的主要问题。谢谢你。一旦我取出设置另一个驱动程序,然后在几次迭代后重新使用 browser.driver,我就能让它工作。

标签: javascript angularjs selenium protractor


【解决方案1】:

从最新版本的 Protractor (v2.2) 开始,使用量角器窗口句柄应该没有问题,它返回当前正在显示的窗口数组。正如 P.T 所指出的,不需要调用单独的驱动程序实例,但 browser 全局变量将起作用。调用弹出窗口的数组索引为0,弹出窗口的数组索引为1。下面是切换到弹出窗口进行操作的示例。

browser.getAllWindowHandles().then(function(handles){
    browser.switchTo().window(handles[1]).then(function(){
        //do your stuff on the pop up window
    });
});

希望这会有所帮助。

【讨论】:

  • 谢谢,这真的很有帮助
  • 您好,我尝试了代码,但得到了同样的错误:UnknownError: unknown error: 'name' must be a nonempty string" 下面是代码 var handlePromise = browser.driver.getAllWindowHandles(); handlePromise。 then(function (handles) { // parentHandle = handles[0]; var popUpHandle = handles[1]; // 改成新的句柄 browser.driver.switchTo().window(popUpHandle); });
  • @anuvratsingh 你能再调试一下并告诉我你在哪一行遇到这个错误吗?您还可以检查handles 数组长度吗?我认为你那里没有两个窗口,只有一个,所以你不能切换到handles[1]。谢谢
  • @GirishSortur - 你能建议如何使它成为一个通用函数吗?我希望使用此功能并切换到下一个选项卡,无论其在 chrome 窗口中的位置如何。因此,如果我的浏览器正在创建一个新标签,我应该切换到那个新标签,如果我的新标签正在创建另一个标签,那么我的浏览器焦点应该切换到那个新标签。
  • @NewWorld 创建一个只调用切换到新窗口的函数,您可以在想要切换到新窗口时使用它,这将是最后一个窗口数组元素。要获取最后一个数组元素,请使用 array.length-1 操作。示例 - browser.switchTo().window(handles[handles.length-1]) - 这将切换到上一个打开的窗口。希望对您有所帮助。
【解决方案2】:

如果您单击任何链接或按钮以打开弹出窗口,请在单击后使用browser.sleep(ms) 添加一些等待。

这对我有用,并消除了“缺少'句柄'参数”错误

element(by.className("name")).click();
browser.sleep(10000); //This line is important
var winHandles=browser.getAllWindowHandles();
winHandles.then(function(handles) 
{
    var parentWindow=handles[0];
    var popUpWindow=handles[1];
    browser.switchTo().window(popUpWindow);
    browser.switchTo().window(parentWindow);
})

【讨论】:

    【解决方案3】:

    如果您调用 https:// url 并再次重定向到 http:// url,那么由于安全问题而出现此弹出窗口。

    1 - 您必须在 https://http://

    中配置这两个应用程序

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2018-01-03
      • 2019-01-11
      • 2017-11-25
      • 2019-02-23
      相关资源
      最近更新 更多