Selenium ChromeDriver:增加获取WebElement Text的时间 [英] Selenium ChromeDriver: increasing time of getting WebElement Text

查看:141
本文介绍了Selenium ChromeDriver:增加获取WebElement Text的时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个代码,我在其中遍历表行和列,我想将它的值添加到列表中。

I have a code in which I traverse table rows and columns, and I'd like to add it's values to a list.

它需要我很多时间。

所以我添加了时间测量,我注意到由于某种原因,时间从一行到另一行增加。

So I added a time measurement, and I noticed that for some reason the time increases from row to row.

我不明白为什么。

你能告诉我吗?

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);
        }
    }
}






伙计们,我继续研究。
首先,Florent的回答对我没有帮助,因为据我所知,它至少给了我一个字符串列表,我必须解析它,我不太喜欢这种解决方案。 ..


Guys, I continued researching. First of all, Florent's kind answer did not help me because, at lease as I understand, It returned me an array list of strings which I had to parse, and I don't like this kind of solution too much...

所以我发现 e.getText()电话的呼叫时间从呼叫到呼叫增加了!
我也试过 e.getAttribute(innerText)而不是改变。
无法理解原因。有什么想法要解决吗?

So I nailed the problem in finding that the e.getText() call was increasing in time from call to call!!! I also tried e.getAttribute("innerText") instead but no change. Can't understand why. Any idea to solve?

            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花费时间的图表.. 。

That is an graph of the time getText took...

08-May-18
增长执行时间的另一个来源是这一个:

08-May-18 Another source of growing execution time is this one:

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次迭代,但是每次调用函数都会增加执行时间。
这个也有解决方案吗?

Every functions has 5 iterations only, but still each call to the function increases its execution time. Is there a solution for this one as well?

推荐答案

你面临的问题是因为Selenium的方式按设计工作。让我们来看看如何执行JavaScript或执行操作

The problem you are facing is because of the way Selenium works by design. Let's look at how a JavaScript get's executed or a operation is performed

tds.get(TABLE_COLUMNS.NAME_COL.getNumVal()).getText();

您有一组对象。 selenium驱动程序在浏览器端为每个对象分配一个唯一的ID

You have a collection of objects. Each object is assigned a unique ID on the browser side by the selenium driver

所以当你执行 getText()以下是发生的事情

So when you do a getText() below is what happens

Your code -> HTTP Request -> Browser Driver -> Browser ->
                                                        |
           <---------------------------------------------

现在,如果您有一张400rx10c的表,那么它会占用 4000 HTTP调用,即使一次调用需要10ms,我们正在查看 40000ms~ = 40sec ,这是读取表格的一个不错的延迟

Now if you have a table of 400rx10c then it accounts to 4000 HTTP calls, even if one call takes 10ms, we are looking at a 40000ms~=40sec, which is a decent delay to read a table

所以你要做的就是通过执行一个可以返回2d数组的javascript来获取所有数据。这很简单,我在网站下面找到了一个代码

So what you want to do is to get all the data in single go by executing a javascript which give you 2d array back. It is quite simple, I found a code on below site

http://cwestblog.com/2016/08/21/javascript-snippet-convert-html-table-to-2d-array/

function tableToArray(tbl, opt_cellValueGetter) {
  opt_cellValueGetter = opt_cellValueGetter || function(td) { return td.textContent || td.innerText; };
  var twoD = [];
  for (var rowCount = tbl.rows.length, rowIndex = 0; rowIndex < rowCount; rowIndex++) {
    twoD.push([]);
  }
  for (var rowIndex = 0, tr; rowIndex < rowCount; rowIndex++) {
    var tr = tbl.rows[rowIndex];
    for (var colIndex = 0, colCount = tr.cells.length, offset = 0; colIndex < colCount; colIndex++) {
      var td = tr.cells[colIndex], text = opt_cellValueGetter(td, colIndex, rowIndex, tbl);
      while (twoD[rowIndex].hasOwnProperty(colIndex + offset)) {
        offset++;
      }
      for (var i = 0, colSpan = parseInt(td.colSpan, 10) || 1; i < colSpan; i++) {
        for (var j = 0, rowSpan = parseInt(td.rowSpan, 10) || 1; j < rowSpan; j++) {
          twoD[rowIndex + j][colIndex + offset + i] = text;
        }
      }
    }
  }
  return twoD;
}

我假设您将上述脚本存储在 SCRIPT中变量然后你可以像下面那样运行它

I assume you store the above script in a SCRIPT variable and then you can run it like below

WebDriver driver = ((RemoteWebElement)table).getWrappedDriver();
Object result = ((JavascriptExecutor)driver).executeScript(SCRIPT + "\n return tableToArray(arguments[0]);" , table);

这将为您提供数据的2D数组,然后您可以按照自己喜欢的方式处理它

This will get you a 2D array of the data and you can then process it the way you like it

这篇关于Selenium ChromeDriver:增加获取WebElement Text的时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆