dus*_*kin 0 java selenium selenium-chromedriver selenium-webdriver
我有一个代码,我遍历表行和列,我想将它的值添加到列表中.
这花了我很多时间.
所以我添加了时间测量,我注意到由于某种原因,时间从一行到另一行增加.
我不明白为什么.
你能告诉我吗?
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
伙计们,我继续研究.首先,Florent的回答对我没有帮助,因为据我所知,它至少给了我一个字符串列表,我不得不解析,我不太喜欢这种解决方案......
所以我找到了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...");
}
}
Run Code Online (Sandbox Code Playgroud)
这是getText花费的时间图...
08年5月18日这个增长执行时间的另一个来源是:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
每个函数只有5次迭代,但每次调用函数都会增加执行时间.这个也有解决方案吗?
调用驱动程序是一项昂贵的操作.要显着缩短执行时间,请使用JavaScript注入以executeScript在单个调用中读取整个表.然后使用Java处理/过滤客户端上的数据.
public ArrayList<?> readTable(WebElement table)
{
final String JS_READ_CELLS =
"var table = arguments[0]; " +
"return map(table.querySelectorAll('tr'), readRow); " +
"function readRow(row) { return map(row.querySelectorAll('td'), readCell) }; " +
"function readCell(cell) { return cell.innerText }; " +
"function map(items, fn) { return Array.prototype.map.call(items, fn) }; " ;
WebDriver driver = ((RemoteWebElement)table).getWrappedDriver();
Object result = ((JavascriptExecutor)driver).executeScript(JS_READ_CELLS, table);
return (ArrayList<?>)result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |