restartBrowserBetweenTests与onPrepare()之间的交互

时间:2019-05-30 13:55:39

标签: selenium protractor

我希望每个测试都在干净的浏览器(Firefox)上运行,所以我使用restartBrowserBetweenTests:true选项。因为我使用的是非角度演示应用程序,所以在onPrepare()函数中,我使用了browser.waitForAngularEnabled(false)。当我运行一个规格时,它工作正常,但是当我运行2个规格时,我有错误。

Angular could not be found on the page. If this is not an Angular application, you may need to turn off waiting for Angular.

我该如何解决?另外,onPrepare在这种情况下是如何工作的-每次启动浏览器时或在所有规格之前一次?

这是我的conf.js

const screenshotReporter = require('./screenshotCustomReporter')

exports.config = {
    capabilities: {
        browserName: 'firefox'
    },

    restartBrowserBetweenTests: true,

    framework: 'jasmine',
    directConnect: true,

    baseUrl: URL,

    specs: ['path/**/*Spec.js'],

    // Options to be passed to Jasmine.
    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000,
        includeStackTrace: true
    },

    onPrepare: () => {
        require("@babel/register");

        jasmine.getEnv().addReporter(screenshotReporter)
        browser.waitForAngularEnabled(false)
    }
}


您可以使用以下简单项目重新创建此问题:

conf.js

exports.config = {
    framework: 'jasmine',
    specs: ['./app.1.js', './app.2.js'],
    seleniumAddress: 'http://localhost:4444/wd/hub',
    restartBrowserBetweenTests:true,
    onPrepare:function(){
        browser.waitForAngularEnabled(false);
    },
}

app.1.js

describe('second test', () => {
    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

app.2.js

describe('first test', () => {
    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

1 个答案:

答案 0 :(得分:2)

OnPrepare定义为套件需要执行的所有设置。就是这个意思 不管规格文件的数量如何,总是一次操作。

您需要了解的一个概念是,只要 启动firefox浏览器,然后WebdriverJs初始化webdriver的实例。 并且量角器中的全局对象浏览器也会被初始化。

在您的情况下,首先使用spec文件启动firefox浏览器,然后执行OnPrepare函数,然后 量角器的默认设置被WaitForAngularEnabled覆盖。但是,当您运行第二个规格文件时, 再次使用新的webdriver和protractor浏览器实例启动了Firefox浏览器 角度应用程序,在这种情况下测试用例将失败。

此问题的解决方案是在规范文件中使用before函数

describe('first test', () => {
      before(() => {
                     browser.waitForAngularEnabled(false);
       });

    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

注意:如果您使用的是restartBrowserBetweenTests:true,那么您将不得不对<< ForceForAngularEnabled>使用 beforeEach()函数,因为每次都会创建新的Webdriver实例。