我希望每个测试都在干净的浏览器(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);
});
});
答案 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实例。