我是量角器的新手,所以请耐心等待。
我已经多次看过这个问题,但是所提出的解决方案都不适合我。我的测试应用程序在非角度登录页面上启动。我设置browser.ignoreSynchronization = true,登录,将其重新设置为false,然后重新加载页面。然后我尝试与结果页面上的元素进行交互。第一个元素没有问题,但是尝试查找第二个元素会引发消息
的类型错误“失败:无法分配给Timed out的只读属性'stack'等待Protractor在11秒后与页面同步。请参阅https://github.com/angular/protractor/blob/master/docs/faq.md 在等待带定位器的元素时 - 定位器:[有效定位器]“
我可以通过将ignoreSychronization设置为true并使用sleeps来使其工作,但这不会破坏使用量角器的整个目的吗?!我可以使用java + selenium,我已经熟练了。
我确定页面正在加载,并且没有未完成的http,超时或其他调用。为了确保,我将超时设置为2分钟,结果相同。
我的测试看起来像这样:
describe('this does not work', function() {
beforeEach(function() {
// log in on non-angular page
// ignoreSynchronization because this isn't an angular page
browser.ignoreSynchronization = true;
var d = browser.driver;
d.get(g.url);
var username_field = d.findElement([valid locator]);
username_field.sendKeys(username);
var next_button = d.findElement([valid locator]);
next_button.click();
var password_field = d.findElement([valid locator]);
password_field.sendKeys(password);
var login_button = d.findElement([valid locator]);
login_button.click();
// done with non-angular page
browser.ignoreSynchronization = false;
browser.get(g.url);
});
it('does not work', function() {
// if you comment out this line, the next will execute successfully
// this succeeds, so page is loaded
expect(element([valid locator]).getText()).toBe('some string');
// otherwise, the exception is thrown trying to get this element
element([valid locator]).click();
element([valid locator]).click();
});
});
欢迎任何帮助/指示/建议。
编辑: 我应该包括我的conf.js:
exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['./specs/**/broken_spec.js'],
useAllAngular2AppRoots: true
}
答案 0 :(得分:1)
在一夜之间思考(是的,我在量角器中做梦),我意识到正确使用承诺可能就是答案。我在How can I wait for a condition?找到了一些非常有用的提示,并将我的测试实现为:
describe('this does not work', function() {
beforeEach(function() {
// log in on non-angular page
// ignoreSynchronization because this isn't an angular page
browser.ignoreSynchronization = true;
[login]
// done with non-angular page
browser.ignoreSynchronization = false;
browser.get(g.url);
});
it('should work', function() {
// log out
var userInfoButton = [valid locator];
browser.driver.isElementPresent(userInfoButton).then(function() {
browser.driver.findElement(userInfoButton).then(function(button) {
button.click();
var logoutButton = [valid locator];
browser.driver.isElementPresent(logoutButton).then(function() {
browser.driver.findElement(logoutButton).then(function(button) {
button.click();
});
});
});
});
});
});