javascript - 我需要在量角器中关闭并打开新浏览器
问题描述
我有一个简单的测试:
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');
,它看起来很好。
请解释我做错了什么?
解决方案
您将函数声明为async
但不等待其中的任何操作。如果您没有SELENIUM_PROMISE_MANAGER
在配置中将您的设置为 false,那么在声明异步函数时,您将在整个测试过程中看到意外行为。这种异步行为可能是您的问题的原因,因此我会确保SELENIUM_PROMISE_MANAGER:false
您在每个函数中等待您的操作。
如果您将第二个测试更改为 console.log(),您的测试通过的原因是您没有与浏览器交互,因此不需要 selenium 会话 ID。每次关闭浏览器时,selenium session id 都会被销毁,并在新的浏览器窗口启动时创建一个新的 session id。
您还应该知道,您可以启用一个配置设置,因此您无需在测试中手动执行此操作。
更新:添加我所描述的代码示例:
注意:如果您已经开发了很多代码,那么将您的框架转换为 Async/await 语法需要付出很大的努力。要获得更快的解决方案,您可以尝试从 it 块中删除 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);
});
推荐阅读
- angular - 使用 ToggleButton ($event) 出现 Angular 错误——发出事件
- c++ - 编译器显示中止调用
- angular - Angular 的 Keycloak 不发送图像的不记名身份验证
- github - 在 coingecko API 上获取所有加密货币 github 存储库
- android - 从按钮 onClick 更改 TextView 属性不起作用
- asp.net - 使用 Chrome 时的 Asp.net MVC 项目不会等待方法以调试模式返回
- c# - C# 正则表达式不包含“*”符号
- android - NotFoundException - 在 android 10 的初始屏幕中
- amazon-web-services - 运行在不同节点上的 k8s 部署的多个副本如何以 READWRITEMANY pv 模式从 aws EBS 卷中读取?
- firebase - 我可以查看本月到目前为止的当前帐单吗?(Firebase Blaze 计划)