我需要在量角器中关闭并打开新的浏览器

时间:2019-03-07 21:15:44

标签: javascript protractor

我有一个简单的测试:

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');,就可以了。

请解释我做错了什么?

2 个答案:

答案 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中添加以上内容,以在两次测试之间重新启动浏览器。

希望它对您有帮助。