Protractor打开新窗口

4

假设我正在开发一个聊天应用程序,用户(X)可以登录该应用程序并向另一个用户(Y)发送消息。

现在,我尝试自动化测试以发送和接收消息,具体步骤如下:

1. X Logs in with his username/password.
2. Selects Y from a list and sends a "Test Message" to Y.
3. X signs out.
4. Y logs in with his username/password.
5. Checks if he has received the message from X.
6. Y replies to X with "Reply to Test Message".
7. Y signs out.
8. X logs in, and checks if he got the reply.

如果我要手动完成这个任务,我会打开两个窗口(其中一个使用无痕模式),在一个窗口中登录X,另一个窗口中登录Y并验证结果。
所以,有几个问题: 1. Protractor是否允许以编程方式生成一个新窗口而无需任何点击?只是一个生成新窗口的函数? 2. 是否可以使这些窗口不共享用户会话(类似于无痕模式)?
4个回答

5
以下内容对我来说很好用。
browser.executeScript('window.open()').then(function () {
     browser.getAllWindowHandles().then(function (handles) {
            var secondWindow = handles[1];
            browser.switchTo().window(secondWindow).then(function () {
                return browser.get(newPageToOpen);
            });
     });
});

希望这能帮到您。

3
您可以通过发送CTRL+SHIFT+N键组合来打开一个新的无痕窗口:
browser.actions()
       .sendKeys(protractor.Key.chord(protractor.Key.CONTROL, protractor.Key.SHIFT ,"n"))
       .perform();

然后使用窗口句柄,在多个窗口之间进行切换。

browser.getAllWindowHandles().then(function(handles){
  browser.switchTo.window(handles[1]); // 0 or 1 to switch between the 2 open windows
});

在你切换窗口之后,所有接下来的方法都会针对当前激活的窗口。 如果该方法在隐身模式下可用,那么在此处也应该可用。


嗨,虽然答案似乎是正确的,但我担心在 Mac 上它不起作用,因为 webdriver 不支持 Key.COMMAND。还有其他替代方案吗? - Aneesh
1
嗯,你在 Mac 上尝试过吗?因为根据 这个:Key.COMMAND 确实受支持。 - vrachlin

0
我是这样做的:
let _2ndBrowser = browser.forkNewInstance();
let url = 'https://google.com';

browser.get(url);
_2ndBrowser.get(url);
browser.element(by.xpath(...)).click();
_2ndBrowser.element(by.xpath(...)).click();

运作良好。

如果你正在使用PageObject,可以将浏览器设置为构造函数参数,并在new中进行设置:

function LoginPage(browserContext) {
  this.setUserName = function(userName){ 
    return browserContext.element(/*locator*/).sendKeys(userName)
  }
}

it('set login name', function() {
  let _2ndBrowser = browser.forkNewInstance();
  let user1LoginPage = new LoginPage(browser);
  let user2LoginPage = new LoginPage(_2ndBrowser);

  user1LoginPage.setUserName('alice');
  user2LoginPage.setUserName('bob');
})

利润 =)


-1
对于所有正在寻找 typescript 解决方案的人来说。
只需要稍作修改,vrachlin 的代码就能运行得很好。
browser.getAllWindowHandles().then(handles => {
   browser.switchTo().window(handles[1]); // 0 or 1 to switch between the 2 open windows
});

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