我正在试图计算一下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语句失败,尽管某些数组值中存在关键字。
有人可以在理解和纠正中纠正我吗?解决上述两个问题?
答案 0 :(得分:1)
开(1)我不是肯定的,但我绝对可以回答(2)帮助改进你的代码
1)这似乎是经典的for
循环范围问题,其中循环在调用时已经完成...请参阅this question以供参考。这与Protractor和控制流程执行有什么关系。
2)你的期望是失败的,因为它会检查每一行,你说的是每行文字的状况与&#39;导航&#39;将评估为真实。对于它们中的很多(即幻灯片,工具提示,加载器等),这将失败。你需要一个更好的断言,例如你可以只做1个链接:expect(results.get(i).getText()).toEqual('Help')
,或者你可以创建一个导航项数组并期望它们匹配等...但你肯定需要一个更好的断言。这项测试到底要做什么?
无论哪种方式,通常都会对您的代码提供一些帮助:
for
个循环。您只需使用each
迭代ElementArrayFinder。这是更多语义,但您可以使用从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++) {
}
})
但同样,在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();
});
});