无法在arraylist中声明关键字的存在

时间:2017-05-30 11:14:20

标签: javascript arraylist automation jasmine protractor

我正在试图计算一下arraylist&然后尝试断言数组值中是否存在关键字。以下是我的代码,它有问题;

private class AsyncQueryTask extends AsyncTask<String, Void, FeatureResult> {

    @Override
    protected void onPreExecute() {

        progress = new ProgressDialog(Naghshe.this);
        progress = ProgressDialog.show(Naghshe.this, "",
                "Please wait....query task is executing");

    }


    @Override
    protected FeatureResult doInBackground(String... queryArray) {

        if (queryArray == null || queryArray.length <= 1)
            return null;

        String url = queryArray[0];
        QueryParameters qParameters = new QueryParameters();
        String whereClause = queryArray[1];
       // SpatialReference sr = SpatialReference.create(102100);
        qParameters.setGeometry(map.getExtent());
      //  qParameters.setOutSpatialReference(sr);
        qParameters.setReturnGeometry(true);
        qParameters.setWhere(whereClause);

        QueryTask qTask = new QueryTask(url);

        try {
            FeatureResult results = qTask.execute(qParameters);

            return results;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(FeatureResult results) {


        if (results != null) {
            int size = (int) results.featureCount();

            for (Object element : results) {
                progress.incrementProgressBy(size / 100);
                if (element instanceof Feature) {
                    Feature feature = (Feature) element;
                    Graphic graphic = new Graphic(feature.getGeometry(),
                            feature.getSymbol(), feature.getAttributes());

                    _graphicsLayer = new GraphicsLayer();
                    _graphicsLayer.addGraphic(graphic);

                    SimpleRenderer sr = new SimpleRenderer(new SimpleFillSymbol(Color.RED));
                    _graphicsLayer.setRenderer(sr);

                    boolean m =false;
                    if(!m)
                    {
                        map.addLayer(_graphicsLayer);
                        m=true;
                    }else {
                        map.removeLayer(_graphicsLayer);

                        map.addLayer(_graphicsLayer);
                    }

                    map.zoomin();

                    k++;
                }
            }
        }
        progress.dismiss();
        boolQuery = false;
    }

输出:

describe('My Test', function() {

    it('Test starts', function() {

    browser.ignoreSynchronization = true;
    browser.get('https://www.w3schools.com/angular/');

    browser.sleep(5000).then(function(){});
    var results = element.all(by.css(".sidesection>p>a"));

    var results_count=results.count().then(function(counting){
        console.log("There are total "+counting+" lines");
        return counting;
    })
    results_count.then (function(count){
        console.log("There are totalx "+count+" lines");

        for (var iterate=1;iterate<count;iterate++){

        results.get(iterate).getText().then(function(text){
            console.log("The text in Relationship Type node line "+iterate+" is ---"+text);
            expect(text.indexOf('Navigation')!=-1).toBeTruthy(); 
        })      
        }
    })
    })

})

我在这里遇到2个问题:

1。)为什么我在所有值列表中得到数字19的硬编码,我希望输出计数像1,2,3,4那样迭代......所以

2.。)为什么我的expect语句失败,尽管某些数组值中存在关键字。

有人可以在理解和纠正中纠正我吗?解决上述两个问题?

1 个答案:

答案 0 :(得分:1)

开(1)我不是肯定的,但我绝对可以回答(2)帮助改进你的代码

1)这似乎是经典的for循环范围问题,其中循环在调用时已经完成...请参阅this question以供参考。这与Protractor和控制流程执行有什么关系。

2)你的期望是失败的,因为它会检查每一行,你说的是每行文字的状况与&#39;导航&#39;将评估为真实。对于它们中的很多(即幻灯片,工具提示,加载器等),这将失败。你需要一个更好的断言,例如你可以只做1个链接:expect(results.get(i).getText()).toEqual('Help'),或者你可以创建一个导航项数组并期望它们匹配等...但你肯定需要一个更好的断言。这项测试到底要做什么?

无论哪种方式,通常都会对您的代码提供一些帮助:

  1. 除非你做的是非常具体的事情,否则你在量角器中确实不需要for个循环。您只需使用each迭代ElementArrayFinder。
  2. 这是更多语义,但您可以使用从promise返回的值,而不是将其分配给变量,您的某些代码有点多余。如果你这样实现它,你可以省略关于results_count的部分:

    results.count().then(function(counting){
         console.log("There are total "+counting+" lines"); // logs 19
         return counting;
    }).then(function (count) {
        console.log(count); // logs 19
        for(var i = 0; i<count; i++) {
    
        }
    })
    
  3. 但同样,在Protractor中,for循环并不是必需的。相反,您可以使用each,这会使您的代码更简洁,并且还会消除您遇到的循环闭包问题:

        var results = element.all(by.css(".sidesection>p>a"));
        results.each(function (elem, index) {
            return elem.getText().then(function (text) {
                console.log('Element at index ' + index + ' has text ' + text);
                // this still fails because it's not a good assertion
                expect(text.indexOf('Navigation')!=-1).toBeTruthy();
            });
        });