使用Selenium/Protractor Javascript切换到新窗口

par*_*eau 9 javascript selenium angularjs protractor

寻找一些帮助,我将如何获得一个新的"弹出窗口"窗口,在我单击"登录"按钮后触发显示该窗口.

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

下面你可以找到我用来创建selenium驱动程序的代码片段,以及尝试"切换到/抓取句柄"弹出的新窗口的代码片段.我知道它无法正常工作,因为我一直在尝试在页面上查找表单的代码中收到"No Such Element"错误.

    // 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);
    });
Run Code Online (Sandbox Code Playgroud)

关于这个的事情:

  1. 如果我删除行"browser.driver.switchTo().window(popUpHandle)"中的"浏览器",那么它读作"driver.switchTo().window(popUpHandle)"我收到了回复,错误显示为"UnknownError" :未知错误:'name'必须是非空字符串"在对此进行一些搜索后,这是因为驱动程序上的"switchTo()"方法不能为null.如果我只使用上面显示的代码,则会清除此错误.

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

谢谢您的帮助

Gir*_*tur 14

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

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

希望这可以帮助.


小智 6

如果您单击任何链接或按钮以打开弹出窗口,请在单击后添加一些等待使用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);
})
Run Code Online (Sandbox Code Playgroud)