[测试angular 2网络应用程序]browser.ignoreSynchronization = false设置为true时会发生此错误,不会发生此错误,这是为什么呢?我还在我的量角器配置中设置了useAllAngular2AppRoots: true。
browser.ignoreSynchronization = false
useAllAngular2AppRoots: true
kmbjn2e31#
WebDriverJS是一个Javascript接口,等价于Java的Webdriver,它允许您以编程方式控制浏览器,这反过来又有助于编写自动化测试用例使用WebDriverJS测试Angular应用程序的问题是,Angular有自己的事件循环,与浏览器的事件循环分开。这意味着当您执行WebDriverJS命令时,Angular可能仍然在做它的事情。解决这个问题的一个方法是让WebDriverJS等待一段任意的时间(例如3000 ms),让Angular完成渲染工作,但这不是正确的方法。因此,我们创建了量角器来同步测试和Angular的事件循环,方法是推迟运行下一个命令,直到Angular完成处理前一个命令。但这里也有一个问题,当你测试非Angular 应用程序时,这会成为一个问题,即使没有Angular 来完成它的循环,量角器也会一直等待Angular 同步,并会引发你正在观察的错误!因此,对于非Angular页面,您可以通过设置browser.ignoreSynchronization = true来告诉Protractor不要查找Angular--实际上这意味着您只是在使用WebDriverJS。因此,如果在配置中添加这个功能,当量角器无法在页面上找到Angular时,你就放弃了所有让测试Angular应用比普通WebDriverJS更容易的功能。是的,在所有命令之后添加browser.sleep可能会起作用,但它很麻烦,一旦Angular的时间超过你设置的暂停时间,它就会中断,使你的测试花费太长时间。
browser.ignoreSynchronization = true
**结论:**测试不使用Angular的页面时,仅使用browser.ignoreSynchronization = true。参考:https://vincenttunru.com/Error-Error-while-waiting-for-Protractor-to-sync-with-the-page/
lbsnaicq2#
你绝对应该确保你的页面在测试中只被加载一次。我们在一个登录模型中遇到了这个问题,它导致加载的页面在第一次加载完成后立即重新加载在Angular 2应用程序的引导代码中。这导致了各种不可预测的行为,测试失败,超时或出现上述错误-或运行良好。因此,在测试之前,请确保您有一致的页面生命周期。
lymnna713#
要在点@ram-pasala上扩展:一种解决方法是让WebDriverJS等待任意时间(即3000 ms),以便Angular完成渲染工作,但这不是正确的操作方式下面是等待函数变为可用的过程。这是针对TestCafe的,但应该很容易适应其他测试框架:
export const waitForAngular = ClientFunction((timeoutMs: number = 60_000) => { const waitForGetAllAngularTestabilities = (timeoutMs: number) => { if (timeoutMs <= 0) throw new Error('Waited for window.getAllAngularTestabilities, but timed out.') const win = (window as any); if (win.getAllAngularTestabilities) { return Promise.resolve(win.getAllAngularTestabilities) } else { return new Promise(res => setTimeout(() => res(true), 100)).then(() => waitForGetAllAngularTestabilities(timeoutMs - 100)) } } return waitForGetAllAngularTestabilities(30_000).then((getAllAngularTestabilities) => { return Promise.all( getAllAngularTestabilities().map( (t) => new Promise((res, rej) => { setTimeout(() => rej(`Waited ${timeoutMs}ms for Angular to stabilize but timed out.`), timeoutMs); return t.whenStable(() => { res(true); console.log('Angular stable'); }); }), ), ) }) });
3条答案
按热度按时间kmbjn2e31#
WebDriverJS是一个Javascript接口,等价于Java的Webdriver,它允许您以编程方式控制浏览器,这反过来又有助于编写自动化测试用例
使用WebDriverJS测试Angular应用程序的问题是,Angular有自己的事件循环,与浏览器的事件循环分开。这意味着当您执行WebDriverJS命令时,Angular可能仍然在做它的事情。
解决这个问题的一个方法是让WebDriverJS等待一段任意的时间(例如3000 ms),让Angular完成渲染工作,但这不是正确的方法。因此,我们创建了量角器来同步测试和Angular的事件循环,方法是推迟运行下一个命令,直到Angular完成处理前一个命令。
但这里也有一个问题,当你测试非Angular 应用程序时,这会成为一个问题,即使没有Angular 来完成它的循环,量角器也会一直等待Angular 同步,并会引发你正在观察的错误!
因此,对于非Angular页面,您可以通过设置
browser.ignoreSynchronization = true
来告诉Protractor不要查找Angular--实际上这意味着您只是在使用WebDriverJS。因此,如果在配置中添加这个功能,当量角器无法在页面上找到Angular时,你就放弃了所有让测试Angular应用比普通WebDriverJS更容易的功能。是的,在所有命令之后添加browser.sleep可能会起作用,但它很麻烦,一旦Angular的时间超过你设置的暂停时间,它就会中断,使你的测试花费太长时间。
**结论:**测试不使用Angular的页面时,仅使用
browser.ignoreSynchronization = true
。参考:https://vincenttunru.com/Error-Error-while-waiting-for-Protractor-to-sync-with-the-page/
lbsnaicq2#
你绝对应该确保你的页面在测试中只被加载一次。我们在一个登录模型中遇到了这个问题,它导致加载的页面在第一次加载完成后立即重新加载在Angular 2应用程序的引导代码中。这导致了各种不可预测的行为,测试失败,超时或出现上述错误-或运行良好。
因此,在测试之前,请确保您有一致的页面生命周期。
lymnna713#
要在点@ram-pasala上扩展:
一种解决方法是让WebDriverJS等待任意时间(即3000 ms),以便Angular完成渲染工作,但这不是正确的操作方式
下面是等待函数变为可用的过程。这是针对TestCafe的,但应该很容易适应其他测试框架: