Interaction between restartBrowserBetweenTests with onPrepare()

我是研究僧i 提交于 2019-12-23 22:42:17

问题


I want each of my tests to run on clean browser (Firefox) so i use restartBrowserBetweenTests:true option. Because i use non-Angular demo app, in onPrepare() function i use browser.waitForAngularEnabled(false). It's works fine, when i run a single spec, but when i run 2 specs, i have error.

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

How can i solve this? And in addition, how onPrepare works in this case - every time when browser starts or one time before all specs?

Here is my 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)
    }
}


You can recreate this issue using the following simple project:

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:


OnPrepare is defined for all settings need to be executed for suite. It means it is always one time operation irrespective of number of spec files.

One concept you need to understand is that whenever the new instance of firefox browser is launched then WebdriverJs initialize the instance of webdriver. and global object browser in protractor also gets initialized.

In your case First spec file start firefox browser, OnPrepare function is executed afterwards and default setting of protractor is overriden by WaitForAngularEnabled.But when you run second spec file, again firefox browser is launched with fresh instance of webdriver and protractor browser which expect angular application and in that case test case gets failed.

The solution for this problem is to use before function in spec file

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);
    });
});

Note : If you are using restartBrowserBetweenTests: true then you will have to use beforeEach() function for waitForAngularEnabled because every time fresh instance of webdriver will be created.



来源:https://stackoverflow.com/questions/56379706/interaction-between-restartbrowserbetweentests-with-onprepare

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!