【发布时间】:2018-04-30 09:43:40
【问题描述】:
我有一个代码可以遍历表的行和列,我想将它的值添加到列表中。
这需要我大量的时间。
所以我添加了一个时间测量,我注意到由于某种原因,时间逐行增加。
我不明白为什么。
你能建议吗?
private void buildTableDataMap() {
WebElement table = chromeWebDriver.findElement(By.id("table-type-1"));
List<WebElement> rows = table.findElements(By.tagName("tr"));
theMap.getInstance().clear();
String item;
for (WebElement row : rows) {
ArrayList<String> values = new ArrayList<>();
List<WebElement> tds = row.findElements(By.tagName("td"));
if(tds.size() > 0){
WebElement last = tds.get(tds.size() - 1);
long time = System.currentTimeMillis();
values.addAll(tds.stream().map(e->e.getText()).collect(Collectors.toList()));
System.out.println(System.currentTimeMillis() - time);
//remove redundant last entry:
values.remove(tds.size() - 1);
callSomeFunc(values, last);
item = tds.get(TABLE_COLUMNS.NAME_COL.getNumVal()).getText();
item = item.replaceAll("[^.\\- /'&A-Za-z0-9]", "").trim();//remove redundant chars
theMap.getInstance().getMap().put(item, values);
}
}
}
伙计们,我继续研究。 首先,弗洛伦特的友好回答对我没有帮助,因为至少据我所知,它返回了我必须解析的字符串数组列表,我不太喜欢这种解决方案......
所以我发现 e.getText() 调用在每次调用之间的时间都在增加,从而解决了这个问题!!! 我也尝试了 e.getAttribute("innerText") 但没有改变。 无法理解为什么。有什么想法可以解决吗?
WebElement last = null;
for (WebElement e : tds){
last = e;
long tm1 = 0, tm2 = 0;
if(Settings.verboseYN) {
tm1 = System.currentTimeMillis();
}
s = e.getText(); //This action increases in time!!!
if(Settings.verboseYN) {
tm2 = System.currentTimeMillis();
}
values.add(s); //a 0 ms action!!!
if(Settings.verboseYN) {
System.out.println("e.getText()) took " + (tm2 - tm1) + " ms...");
}
}
这是 getText 所用时间的图表...
18 年 5 月 8 日 增加执行时间的另一个来源是:
void func(WebElement anchorsElement){
List<WebElement> anchors = anchorsElement.findElements(By.tagName("a"));
for (WebElement a : anchors) {
if (a.getAttribute("class").indexOf("a") > 0)
values.add("A");
else if (a.getAttribute("class").indexOf("b") > 0)
values.add("B");
else if (a.getAttribute("class").indexOf("c") > 0)
values.add("C");
}
}
每个函数只有 5 次迭代,但每次调用该函数仍会增加其执行时间。 这个也有解决办法吗?
【问题讨论】:
-
使用您尝试自动化的手动步骤以及相关的HTML更新问题
-
@DebanjanB 没有具体的手动步骤。我想做的是从一些站点表中提取数据。所有的表都具有相同的结构。
-
您是否发现网站本身需要时间返回数据或硒代码对此负责?
-
@HelpingHands 我不确定问题出在站点、selenium 基础架构还是仅仅是 java。请注意,我只是测量时间: values.addAll(tds.stream().map(e->e.getText()).collect(Collectors.toList()));它是从测量到测量不断增加的。也许这是合乎逻辑的并且取决于初始值列表的大小?
-
@dushkin - 您尝试与之交互并存储到数组中的页面共有多少行?
标签: java selenium selenium-webdriver selenium-chromedriver