当我执行protractor protractor.conf.js --baseUrl=http://localhost:4200/
时,它工作得很好-填充数据,验证元素等。
当我尝试通过远程URL protractor protractor.conf.js --baseUrl=http://the-same-website.com/
测试完全相同的网站时,它会在浏览器中打开,登录并且所有必需的部分都像在localhost中一样被加载,但是Protractor / Jasmine不会填充/单击/验证任何内容,并且我在指定的时间后超时:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
- Failed: script timeout: result was not received in 30 seconds
(Session info: chrome=71.0.3578.98)
还有其他线程在堆栈溢出上也会有类似的问题-尝试过browser.ignoreSynchronization = true
和Protractor.waitForAngular(false)
,但是页面无法正确加载,并且由于找不到元素而导致测试失败。
更新1
下面的测试在localhost上运行良好-根据h1输出成功或失败,但是在远程URL上,尽管加载了Web,它仍然不检查任何内容:
import { browser, by, element } from 'protractor';
describe('example-test', () => {
const PATH_TO_TEST = 'specific-path/to/test';
beforeEach(() => {
browser.get(PATH_TO_TEST);
});
it('should exist header', () => {
expect(element(by.css('h1')).getText()).toEqual('test');
});
});
如果添加日志记录,则会看到输出,但未执行expect
:
import { browser, by, element } from 'protractor';
describe('example-test', () => {
const PATH_TO_TEST = 'specific-path/to/test';
beforeEach(() => {
browser.get(PATH_TO_TEST);
console.log('beforeEach');
});
it('should exist header', () => {
expect(element(by.css('h1')).getText()).toEqual('test');
console.log('test end');
});
});
量角器配置:
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 30000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
onPrepare() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
}
更新2
如果我添加了browser.sleep
和browser.ignoreSynchronization
,则测试开始起作用,但是对于每次看起来不太好的同步,我都需要添加browser.sleep
:
beforeEach(() => {
browser.get('path/to/test');
browser.sleep(3000);
browser.ignoreSynchronization = true;
});
似乎量角器无法识别页面为完全加载页面还是Angular网站。
尽管页面已正确加载,为什么量角器仍无法验证内容?
答案 0 :(得分:0)
已更新:完成了更改后的原始建议答案。
此问题可能是由于您的登录页面的性质所致。如果您的登录是非角度的,那么您必须指示量角器不要等待角度变为可测试(默认情况下将是可测试的)。为此,您可以使用 browser.waitForAngularEnabled(false)命令,此命令是推荐的新方法,与以前的 browser.ignoreSynchronization = true 相反。
登录到应用程序后,可以将 browser.waitForAngularEnabled 设置为true,并且该规范中的其余测试应正常运行。
describe('Main', function {
beforeAll(function () {
browser.waitForAngularEnabled(false);
Site.login();
//after you have successfully logged into you site you can
browser.waitForAngularEnabled(true);
});
it('should show the main page', function () {
//Your code
});
});