我有一个简单的测试:
beforeEach(function () {
lib.startApp(constants.ENVIRONMENT, browser);//get url
loginPageLoc.loginAs(constants.ADMIN_LOGIN,constants.ADMIN_PASSWORD,
browser);// log in
browser.driver.sleep(5000); //wait
});
afterEach(function() {
browser.restart(); //or browser.close()
});
it('Test1' , async() => {
lib.waitUntilClickable(adminManagersPage.ButtonManagers, browser);
adminManagersPage.ButtonManagers.click();
expect(element(by.css('.common-popup')).isPresent()).toBe(false);
});
it('Test2' , async() => {
lib.waitUntilClickable(adminManagersPage.ButtonManagers, browser);
adminManagersPage.ButtonManagers.click();
expect(element(by.css('.common-popup')).isPresent()).toBe(false);
});
第一次迭代看起来不错,但是在.restart()
之后,我得到了:
失败:此驱动程序实例没有有效的会话ID(您是否已 调用WebDriver.quit()?),可能不再使用。 NoSuchSessionError: 该驱动程序实例没有有效的会话ID(您是否致电 WebDriver.quit()?),可能不再使用。
如果我使用.close()
,我会得到:
失败:无效的会话ID
但是,如果我在简单的Test2
上更改console.log('case 1');
,就可以了。
请解释我做错了什么?
答案 0 :(得分:1)
您正在将函数声明为async
,但不等待其中的任何操作。如果您没有在配置中将SELENIUM_PROMISE_MANAGER
设置为false,那么在声明异步功能时,您将在整个测试中看到意外的行为。这种异步行为可能是导致您出现问题的原因,因此,我将确保SELENIUM_PROMISE_MANAGER:false
并确保您等待每个功能中的操作。
如果将第二项测试更改为console.log(),则测试通过的原因是因为您未与浏览器进行交互,因此不需要硒会话ID。每次关闭浏览器时,硒会话ID都会被破坏,并在启动新的浏览器窗口时创建一个新的硒会话ID。
另外,您应该意识到可以启用there is a config setting,因此您无需在测试中手动进行操作。
更新:添加我所描述的代码示例:
注意:如果您已经开发了很多代码,则需要花费大量精力将框架转换为Async / await语法。为获得更快的解决方案,您可以尝试从其中删除async关键字块
将这些添加到您的配置
SELENIUM_PROMISE_MANAGER:false,
restartBrowserBetweenTests:true
并将您的规格更改为
beforeEach(async function () {
await lib.startApp(constants.ENVIRONMENT, browser);//get url
await loginPageLoc.loginAs(constants.ADMIN_LOGIN, constants.ADMIN_PASSWORD,
browser);// log in
await browser.driver.sleep(5000); //wait
});
it('Test1', async () => {
await lib.waitUntilClickable(adminManagersPage.ButtonManagers, browser);
await adminManagersPage.ButtonManagers.click();
expect(await element(by.css('.common-popup')).isPresent()).toBe(false);
});
it('Test2', async () => {
await lib.waitUntilClickable(adminManagersPage.ButtonManagers, browser);
await adminManagersPage.ButtonManagers.click();
expect(await element(by.css('.common-popup')).isPresent()).toBe(false);
});
答案 1 :(得分:0)
有一个相关的配置选项:
//如果为true,则量角器将在每次测试之间重新启动浏览器。
restartBrowserBetweenTests: true,
在您的config
中添加以上内容,以在两次测试之间重新启动浏览器。
希望它对您有帮助。