0

所以我会直接跳到它......
我是一名测试自动化工程师,我正在制作一个由 JSON 驱动的“关键字驱动”测试系统,它与 Selenium 测试结合以在 Web 浏览器上运行。

“关键字”存储为 XML 文件,我有一个 JavaScript 函数,它将这些关键字加载到一个数组中,并存储该关键字的索引。到 paf.keywordIndex

例子


$.get("getSteps.php", function(keywords) {
            paf.keywords = eval(keywords); // stores into an array...

            paf.keywordIndex = -1;
            for ( var i = 0 ; i < paf.keywords.length ; i++ ) {

                // for each path...
                /* alert(paf.keywords[i]); */

                $.ajax({url: "./_keywords/" + paf.keywords[i], success: function(xml) {         
                    paf.xml = xml;

                    paf.keywordIndex++;
                    var title = $(xml).find("keyword").attr("title");
                    //var name = $(xml).find("keyword").attr("name");

                    paf.buffer += ("<option value=\"./_keywords/"+paf.keywords[paf.keywordIndex]+"\">"+title+"</option>");
                },
                async: false
                //cache: false
                });

            }

            $(stepSelectionLocator).html(paf.buffer);
        });

getSteps.php是一个 php 服务,它返回一个 json 数组中的所有 xml 关键字。例如 ["Login.xml","EndSession.xml", "SelectResult.xml", etc...]


现在这个函数可以工作了,但唯一的问题是,它没有以任何方式排序。所以输出将是 -

  • 登录 (Login.xml)
  • 选择一个结果 (SelectResult.xml)
  • 结束会话 (EndSession.xml)

为了解决这个问题,我在 my so 中添加了一个额外的属性,<keyword>现在它<keyword area="basic">表明这是一个基本步骤。现在我的功能是 -

$.get("getSteps.php", function(keywords) {
            paf.keywords = eval(keywords); // stores into an array...

            paf.keywordIndex = -1;
            for ( var i = 0 ; i < paf.keywords.length ; i++ ) {

                // for each path...
                /* alert(paf.keywords[i]); */



                $.ajax({url: "./_keywords/" + paf.keywords[i], success: function(xml) {         
                    paf.xml = xml;

                    paf.keywordIndex++;
                    var title = $(xml).find("keyword").attr("title");
                    var area = $(xml).find("keyword").attr("area");
                    //var name = $(xml).find("keyword").attr("name");

                    paf.buffer.push(area.toUpperCase() + ": " + title);
                },
                async: false
                //cache: false
                });

            }

            paf.buffer.sort(); // array is sorted...



            paf.buffer2 = "";
            paf.keywordIndex = -1;
            for ( var a in paf.buffer ) {
                paf.keywordIndex++;
                paf.buffer2 += "<option value=\"./_keywords/"+paf.keywords[paf.keywordIndex]+"\">"+ paf.buffer[a] + "</option>"; 
            }

            $(stepSelectionLocator).html(paf.buffer2.toString().replace(",", ""));
        });

现在输出是

  • 基本:结束会话 (Login.xml)
  • 基本:登录(SelectResult.xml)
  • 结果:选择一个结果(EndSession.xml)


所以我已经确定索引是问题所在。但是,我无法找到解决此问题的方法..

我对替代方案持开放态度,因此,如果您找到一种更简单的索引方法,请告诉我!

4

1 回答 1

1

首先,很高兴确切地知道您从初始请求中获得的数据。

$.get("getSteps.php", function (keywords) {
    paf.keywords = JSON.parse(keywords); // eval is bad! Use JSON.parse instead.
    console.log(paf.keywords); // what does it output in the console?
    ...

其次,您可以仅使用i变量来引用当前索引。如果您不在paf.keywordIndex其他地方使用,则可以将其删除,因为它是多余的。

第三,您是否绝对、绝对、100% 确定您的 ajax 请求是*S *同步的?如果他们不是 - 响应将随机到达,整个事情将需要不同的方法。

最后,如果您想在获得所有关键字后对关键字应用排序,我建议将它们作为对象推送到缓冲区数组中:

buffer.push({
    keyword: keywordName, // this is the keyword name
    keywordIndex: i, // this is the initial index
    keywordArea: areaObtainedFromXML // this is the area you get from xml
});

通过使用上述方法,您将能够以多种方式对缓冲区进行排序,同时保留初始顺序。

请在这个 jsfiddle看一个人为的例子。

于 2012-12-17T19:57:50.053 回答