Angularjs 量角器找不到元素
在测试我的angular应用程序时,我很难让量角器按预期运行。我的等级库文件如下所示:Angularjs 量角器找不到元素,angularjs,protractor,Angularjs,Protractor,在测试我的angular应用程序时,我很难让量角器按预期运行。我的等级库文件如下所示: describe('app login', function() { it('should allow admin user to log in', function() { browser.get('http://localhost:3008'); //we can find the log in link expect(element(by.id('login-lin
describe('app login', function() {
it('should allow admin user to log in', function() {
browser.get('http://localhost:3008');
//we can find the log in link
expect(element(by.id('login-link')).getText()).toContain('Log in');
//open login dialog
element(by.id('login-link')).click();
browser.ignoreSynchronization = true;
browser.sleep(1000);
//enter credentials
element(by.id('login-username')).sendKeys('User1');
element(by.id('login-password')).sendKeys('Password1');
browser.sleep(1000);
//log in
var el = element(by.id('login-btn'));
//WORKS IF BELOW LINE IS COMMENTED OUT
el.click();
browser.sleep(1000);
//display confirms login
expect(element(by.id('user-display')).getText()).toContain('User1');
});
});
请注意,我在开始时遇到了同步错误,这就是为什么我将ignoreSynchronization标志设置为true,并且所有这些browser.sleeps
现在是这样的:如果我删除el.click()语句(以及最后的expect调用),测试将顺利通过。但是,一旦包含该行,我就可以使用locator:By.id(“登录用户名”)找到NoSuchElementError:No元素。请注意,这个元素并不是我实际要单击的元素,这是奇怪的一部分 您必须使用以下命令等待元素完全显示:
browser.driver.wait(function() {
return element(by.css(YourElement'/login-username)).isDisplayed().then(function(IsVisible) {
return IsVisible;
});
}, 10000);
或
或者,您想通过使用GoogleChrome控制台键入:document.querySelector(“您的CSS选择器”)来验证所使用的选择器是否正确。您可以尝试以下操作:
我在测试我的登录页面时遇到了同样的问题,量角器在呈现元素之前搜索元素。使用量角器的预期条件告诉框架在继续之前等待某个元素的特定条件发生(当然有超时限制)。如果您的错误可能与测试窗口的显示大小有关,您可能希望在启动测试服时最大化驾驶员的可见性 要做到这一点,您可以将以下代码行包括到
dragrator.conf.js
文件中:
onPrepare() {
browser.driver.manage().window().maximize();
}
让我先把你的问题分为三个部分。 让我们一步一步来:
1)
忽略同步标志设置为true
:指示量角器不等待角度承诺。当您i)在等待$http或$timeout解决问题时测试场景ii)针对非角度站点进行测试时,可以使用此选项。这些是您应该将ignoreSynchronization设置设置设置为true的时间。问问自己,你的考试是否需要它作为先决条件?根据您上面的解释,我相信您可以将其设置为false并安全地继续测试。如果在不需要时将其设置为true,则指示量角器在执行操作之前不要尝试与页面同步。这可能是有害的,因为量角器不会等到$timeouts和$http调用被处理,这可能会导致测试变得不稳定。更多关于:
一旦将此标志设置为
False
,就可以删除不必要的browser.sleep()。
2)
量角器未找到元素
:量角器未检测到元素的原因有多种:
-元素不适合显示窗口。
-元素不可见,但存在。
-异步任务未正确处理。
-另一个元素覆盖在另一个元素上 我建议你试试:
3)过度使用
浏览器。睡眠(1000)代码>:在您的代码中,使用sleep()会使其变得脆弱,如果系统运行速度低于正常速度,则有时会失败。这是一种让你的测试失败的邀请,通常在不可再现的场景中。因此,除非您想把时间花在无用的调试上,否则请停止使用它
相反,使用这些等待策略:显式等待,waitforAngular;确保在进入下一步之前完成异步事件。如果您需要了解更多,请在下面留下评论,否则我将严格按照您提出的问题保留此答案。
请走开 可以显示html吗?为什么需要将忽略同步
设置为真
?如何引导angular,以及在哪里定义了ng app
?Thanks@alecxe当前位置我还不明白为什么我需要忽略同步!否则它永远不会同步。我知道这可能与http调用(没有)或$timeout有关。我也没能找到其中的任何一个,但我不太确定,因为除了检查代码库之外,我不知道有什么办法可以找到答案。ng app是在html元素上定义的。
let EC: any = protractor.ExpectedConditions;
return browser.wait(EC.visibilityOf($('#login-username')), 6000);
onPrepare() {
browser.driver.manage().window().maximize();
}
describe('app login', function() {
it('should allow admin user to log in', async() => {
await browser.get('http://localhost:3008');
//we can find the log in link
expect(await element(by.id('login-link')).getText()).toContain('Log in');
//open login dialog
await element(by.id('login-link')).click();
//try putting this setting in your protractor.conf file instead of describe
//block
//browser.ignoreSynchronization = false;
//enter credentials
await element(by.id('login-username')).sendKeys('User1');
await element(by.id('login-password')).sendKeys('Password1');
//log in
var el = element(by.id('login-btn'));
//WORKS IF BELOW LINE IS COMMENTED OUT
await el.click();
//display confirms login
expect(await element(by.id('user-display')).getText()).toContain('User1');
});
});