【问题标题】:I need close and open new browser in protractor我需要在量角器中关闭并打开新浏览器
【发布时间】:2019-03-07 21:15:43
【问题描述】:

我有一个简单的测试:

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()?) 并且可能不再使用。 NoSuchSession错误: 此驱动程序实例没有有效的会话 ID(您是否调用过 WebDriver.quit()?) 并且可能不再使用。

如果我使用.close(),我会得到:

失败:会话 ID 无效

但如果我将Test2 更改为简单的console.log('case 1');,它看起来很好。

请解释我做错了什么?

【问题讨论】:

    标签: javascript protractor


    【解决方案1】:

    您将函数声明为async,但并未等待其中的任何操作。如果您没有在配置中将 SELENIUM_PROMISE_MANAGER 设置为 false,那么在声明异步函数时,您将在整个测试过程中看到意外行为。这种异步行为可能是您的问题的原因,因此我会确保 SELENIUM_PROMISE_MANAGER:false 并确保您在每个函数中等待您的操作。

    如果您将第二个测试更改为 console.log(),您的测试通过的原因是您没有与浏览器交互,因此不需要 selenium 会话 ID。每次关闭浏览器时,selenium session 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);
    });
    

    【讨论】:

    • 感谢您的解释!我已经按照您的建议完成了,但现在我收到错误:UnhandledPromiseRejectionWarning: NoSuchElementError: No element found using locator: By(css selector, [type=email])。
    • @ArtemKrynychyi 你确定定位器是正确的吗?您似乎缺少“电子邮件”周围的引号?
    • 是的,因为当我开始旧版本的测试时,它看起来不错
    • @Artem 在您的脚本以原始方式进行元素交互之前,您的脚本是否有可能失败?您能否尝试在该定位器的电子邮件部分周围添加一些引号,如果没有引号,我无法看到该定位器将如何工作,但可能会出错
    • 我已经弄清楚为什么它以前没有用过。我使用了非异步的函数 LoginAs。现在我已经解决了这个问题,它看起来不错。感谢您的帮助!!!
    【解决方案2】:

    有一个相关的配置选项:

    // 如果为真,量角器将在每次测试之间重新启动浏览器。

    restartBrowserBetweenTests: true,
    

    在您的config 中添加以上内容以在您的测试之间重新启动浏览器。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多