我希望每个测试都在干净的浏览器 (Firefox) 上运行,因此我使用 restartBrowserBetweenTests:true
选项。因为我使用非 Angular 演示应用程序,所以在 onPrepare()
函数中我使用 browser.waitForAngularEnabled(false)
。当我运行单个规范时,它工作正常,但是当我运行 2 个规范时,我遇到错误。
在页面上找不到 Angular。如果这不是 Angular 应用程序,您可能需要关闭等待 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);
});
});
最佳答案
OnPrepare 是为套件需要执行的所有设置而定义的。就是这个意思 无论规范文件的数量有多少,始终是一次性操作。
您需要理解的一个概念是,每当新实例 Firefox 浏览器启动后,WebdriverJs 初始化 webdriver 的实例。 Protractor 中的全局对象浏览器也被初始化。
在您的情况下,第一个规范文件启动 Firefox 浏览器,随后执行 OnPrepare 函数, Protractor 的默认设置被 WaitForAngularEnabled 覆盖。但是当您运行第二个规范文件时, Firefox 浏览器再次启动,并带有新的 webdriver 和 Protractor 浏览器实例,预计 角度应用程序,在这种情况下测试用例会失败。
解决这个问题的方法是在spec文件中使用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 那么您将必须使用 beforeEach() 函数来等待 waitForAngularEnabled,因为每次都会创建新的 webdriver 实例。
关于selenium - restartBrowserBetweenTests 与 onPrepare() 之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379706/