Javascript 如何让量角器延迟承诺生效? 场景1)陈旧元素引用错误
我认为上面的代码在所有元素上运行完迭代之后,队列上会有大量承诺。但是当def.then语句运行时,Selenium会告诉我有过时的元素。迭代正在运行该css的元素 我希望得到一系列关于迭代所要求的一切的解决承诺 场景2)提供了过时的元素引用Javascript 如何让量角器延迟承诺生效? 场景1)陈旧元素引用错误,javascript,promise,protractor,Javascript,Promise,Protractor,我认为上面的代码在所有元素上运行完迭代之后,队列上会有大量承诺。但是当def.then语句运行时,Selenium会告诉我有过时的元素。迭代正在运行该css的元素 我希望得到一系列关于迭代所要求的一切的解决承诺 场景2)提供了过时的元素引用 var-promises=Array(); var等位基因:webdriver.IWebElement[]=[]; 它(“应具有所有元素”,功能(完成){ var-alllinks:webdriver.WebElement[]; browser.contro
var-promises=Array();
var等位基因:webdriver.IWebElement[]=[];
它(“应具有所有元素”,功能(完成){
var-alllinks:webdriver.WebElement[];
browser.controlFlow().execute(()=>{
browser.findElements(按.tagName(“a”))。然后((工作)=>{
所有链接=工作;
alllinks.forEach((ele)=>{
promises.push(ele.getAttribute(“href”);
promises.push(ele.getId());
promises.push(ele.getInnerHtml());
promises.push(ele.getLocation());
});
//正在获取过时的引用。。。
量角器。承诺。所有(承诺)。然后((wtf)=>{
调试器;
});
调试器;
});
});
请告知。我的小例子可能会对您有所帮助:
viewBookingDetailsPage.roomtypeAttributeForParticularDay = function (day, roomTypeNumber, selector) {
var deferred = protractor.promise.defer();
element.all(by.repeater(viewBookingDetailsPage.guestroomInfo.allDays)).then(function (days) {
days[day].all(by.repeater(viewBookingDetailsPage.guestroomInfo.roomTypesInDay)).then(function (roomTypes) {
deferred.fulfill(roomTypes[roomTypeNumber].$(selector));
});
});
return deferred.promise;
};
承诺成功解决后,您需要使用“履行”返回结果。我认为您需要:
现在,
链接
将包含一个解析为对象数组的承诺。这个承诺数组是在哪里创建和解析的?我必须将所有承诺存储在一个数组中吗?每个get xx都是上面代码中的承诺。我想知道为什么会运行回调,您似乎不会在任何地方解析延迟的承诺。
var promises = Array<webdriver.promise.Promise<any>>();
var allElements: webdriver.IWebElement[] = [];
it("should have all elements", function (done) {
var alllinks: webdriver.WebElement[];
browser.controlFlow().execute(() => {
browser.findElements(by.tagName("a")).then((works) => {
alllinks = works;
alllinks.forEach((ele) => {
promises.push(ele.getAttribute("href"));
promises.push(ele.getId());
promises.push(ele.getInnerHtml());
promises.push(ele.getLocation());
});
//getting stale reference here...
protractor.promise.all(promises).then((wtf) => {
debugger;
});
debugger;
});
});
viewBookingDetailsPage.roomtypeAttributeForParticularDay = function (day, roomTypeNumber, selector) {
var deferred = protractor.promise.defer();
element.all(by.repeater(viewBookingDetailsPage.guestroomInfo.allDays)).then(function (days) {
days[day].all(by.repeater(viewBookingDetailsPage.guestroomInfo.roomTypesInDay)).then(function (roomTypes) {
deferred.fulfill(roomTypes[roomTypeNumber].$(selector));
});
});
return deferred.promise;
};
var links = element.all(by.tagName("a")).map(function (link) {
return {
href: link.getAttribute("href"),
id: link.getId(),
innerHTML: link.getInnerHtml(),
location: link.getLocation()
}
});