Protractor(WebDriverJS)无法切换窗口。nameOrHandle未定义。

3

我已尝试多种方法,但仍无法使其工作。我正在尝试使用弹出窗口自动登录(Protractor只是WebDriverJS的包装器,添加了一些AngularJS功能)。WebDriver进入我的主页,点击登录按钮并等待登录弹出窗口。

到目前为止,我已经:

var ptor =  protractor.getInstance();
beforeEach(function() {
  var handlesDone = false;
  ptor = protractor.getInstance();
  ptor.get('#/');
  runs(function() {
    return ptor.findElement(protractor.By.className('btn')).click();
  });
  waits(3000);
  runs(function() {
    return ptor.getAllWindowHandles().then(function(handles) {
      popUpHandle = handles[1];
      parentHandle = handles[0];
      return handlesDone = true;
    });
  });
  waitsFor(function() {
    return handlesDone;
  });
});

到目前为止一切顺利,接下来我想确定我是否确实拥有一个弹出窗口的窗口句柄:

describe('login', function() {
  it('should switch to popUp\'s handle', function() {
    expect(popUpHandle).toBeDefined();

最后,我尝试切换到这个窗口:
    ptor.switchTo().window(popUpHandle).getWindowHandle().then(function(handle) {
      expect(handle).toEqual(popUpHandle);
    });
  });
});

无论我尝试什么方法,都无法避免出现以下错误:
login
    should switch to popUp's handle

Failures:

  1) login should switch to popUp's handle
   Message:
     ReferenceError: nameOrHandle is not defined
   Stacktrace:
     ReferenceError: nameOrHandle is not defined
    at webdriver.WebDriver.TargetLocator.window (.../node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/webdriver.js:1385:32)
    at null.<anonymous> (.../test/e2e/e2e-spec.js:40:21)
    at ...node_modules/protractor/jasminewd/index.js:54:12
    at webdriver.promise.ControlFlow.runInNewFrame_ (.../node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1438:20)
    at webdriver.promise.ControlFlow.runEventLoop_ (.../node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1303:8)
    at Timer.exports.setInterval.timer.ontimeout (timers.js:234:14)
==== async task ====

Finished in 5.388 seconds
1 test, 2 assertions, 1 failure

正如您所看到的,我有两个断言:

popUpHandle已定义

在switchTo之后的句柄与popUpHandle相同

我已经测试了总共有2个句柄。我已经测试了它们都是字符串。我已经测试了它们彼此不同。在这个例子中,我测试popUpHandle是否被定义。所有这些测试都通过了。然而,无论我做什么,在尝试将句柄插入.switchTo().window()方法时,我都会得到相同的“nameOrHandle未定义”的错误。

我感到困惑。WebDriverjs上的文档非常少,我甚至不能确定switchTo是否已实现。有人知道这里发生了什么吗?

谢谢。


虽然不确定是否正确,但你尝试过以下代码吗: ptor.switchTo().window(popUpHandle) ptor.getWindowHandle().then(function(handle) { expect(handle).toEqual(popUpHandle); }); - Claudijo
我不太了解如何调试你的代码,但是想说它对我启动和运行很有帮助! - iangilman
1个回答

0
在切换到另一个窗口之前,添加ptor.ignoreSynchronization = truebrowser.ignoreSynchronization = true。(在新的实现中使用browser.ignoreSynchronization=true,其中browser替换了protractor.getInstance()请参阅此链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接