首页 > 解决方案 > 我需要在量角器中关闭并打开新浏览器

问题描述

我有一个简单的测试:

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');,它看起来很好。

请解释我做错了什么?

标签: javascriptprotractor

解决方案


您将函数声明为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);
});

推荐阅读