让我们说我正在开发一个聊天应用程序,用户(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.量角器是否允许在不随地点击的情况下打开新窗口的方式?只是一个以编程方式生成新窗口的函数? 2.是否可以让这些窗口不共享用户的会话(有点像隐姓埋名)?
答案 0 :(得分:3)
您可以通过发送CTRL + SHIFT + N键组合打开一个新的隐身声明:
user_username
然后使用窗口句柄,并在窗口之间切换
browser.actions()
.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, protractor.Key.SHIFT ,"n"))
.perform();
在窗口之间切换后,所有下一个方法都将用于活动窗口。 如果它在隐姓埋名中适合你,也应该在这里工作。
答案 1 :(得分:3)
以下对我来说很好。
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);
});
});
});
希望这有帮助。
答案 2 :(得分:0)
对于正在寻找打字稿解决方案的每个人。
具有较小更改的vrachlin代码可以正常运行:
browser.getAllWindowHandles().then(handles => {
browser.switchTo().window(handles[1]); // 0 or 1 to switch between the 2 open windows
});
答案 3 :(得分: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,则可以将浏览器设置为构造函数参数。并设置为新:
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');
})
利润=)