首页 > 解决方案 > 如何读取 Json 并将其属性传递给使用量角器返回承诺的页面方法

问题描述

我需要使用量角器通过 for 循环迭代 Json 的帮助:

我的问题的背景:

  1. 我有一个返回 REST 服务的 Json 响应的方法。
  2. 响应在另一种方法中处理,并通过 for 循环进行迭代。在每次迭代期间,id 被传递到页面类(页面对象模型)中元素的 xpath,其中元素被单击并返回一个承诺。
  3. for 循环内的代码只成功执行一次,其余的迭代中调用页面类方法正在发生,但该页面方法内的元素单击没有发生。
  4. 我知道在我的代码中通过 for 循环处理承诺有问题。搜索了许多页面和博客,并尝试了他们建议的方式,但没有成功。我只是在下面提到其中一个博客中建议的循环处理 Promise 的一种方法。

对此的帮助非常感谢。

这是我的测试代码:

    **Method that returns REST Api response:** This method returns rest api response using node fetch.

    getRestApiResponse(resp) {
            let nf = require('node-fetch');
            let clientHierarchyDtos: ClientHierarchyDto[];
            let url = 'some url';

            nf(url)
            .then(function(response) { 
                return response.json();
             }).then(function(data) {
                 resp(data);
            })

        }

      ClientHierarchy class: This is the structure of Json data.

      export class ClientHierarchyDto {

    id: string;
    label: string;
    name: string;
    childLevels: ClientHierarchyDto[];

}

    **Test Method code where this response is iterated:**

    const rqnsCascadeRestServiceObj: rqnsCascadeRestService = new rqnsCascadeRestService();

      let clientHierarchies: ClientHierarchyDto[];
      var promises = [];
      rqnsCascadeRestServiceObj.getRestApiResponse(function (resp) {
        const clientHierarchies = resp;
        console.log("hierarchy size: " + clientHierarchies.length);
        for (let regionLevelHierarchy of clientHierarchies) {
          const rqnsCascadeMeasureDashboardPage: rqnsCascadeMeasureDashboard = new rqnsCascadeMeasureDashboard();
                promises.push(rqnsCascadeMeasureDashboardPage.expandAccordian(regionLevelHierarchy.id));

        }

        Promise.all(promises).then((data) => {
          return true;
      }, (error) => {
          return false;

      });
      });

    **Page class method where element click is happening:** This is the method to which ids from json is passed to element locator and clicking the element.

    Accordian:ElementFinder; 
    expandAccordian(Id:string) {
            console.log("accordianId inside: "+ Id);
            this.Accordian = element(by.id(Id));          
            return this.Accordian.click();
        }


    Please let me know if anything else is needed.

标签: jsonfor-loopprotractorangular-promise

解决方案


推荐阅读