使用webdriver从Web表检索列数据的更好方法

时间:2015-05-22 18:57:58

标签: java selenium-webdriver webdriver

我正在尝试将表中的数据提取到java中的List<List<String>>。下面的代码工作。但它需要20多秒才能获取数据。想知道是否有其他faster方法从表中获取数据?

List<WebElement> rows = table.findElements(By.xpath(".//tbody//tr//td//.."));
List<ArrayList<String>> rowsData = new ArrayList<ArrayList<String>>();

for(WebElement row:rows){
    List<WebElement> rowElements = row.findElements(By.xpath(".//td"));

    ArrayList<String> rowData = new ArrayList<String>();

    for(WebElement column:rowElements){
        rowData.add(column.getText().toString());
    }

    rowsData.add(rowData);
}

return rowsData;

4 个答案:

答案 0 :(得分:1)

我认为JSoup是更大的html解析的更好选择。它为Selenium提供了非常相似的API。

String html =  driver.findElement(By.tagName("table")).getAttribute("innerHTML");
ArrayList<String> colsArray = new ArrayList<>();
HashMap<Element, ArrayList<String>> dict = new HashMap<>();

Document document = Jsoup.connect(html).get();
Elements table = document.select("table");

Elements rows = table.select("tr");

for (Element row: rows){

    Elements list = row.select("td");
    ArrayList<String> newList = new ArrayList<>();

    for (Element str: list){
        newList.add(str.text());
    }

    dict.put(row ,newList);
}

return dict;

答案 1 :(得分:0)

首先,你的问题对我来说有点意外,它是如何运作的?您在xpath中有.,根据我的知识,selenium在xpath中需要.。无论如何回答你的问题:

  1. 如果有可能使用除xpath之外的任何其他元素定位器然后使用它,它肯定会减少执行时间。由于你已经在那里使用了循环,每个循环都会尝试使用xpath定位元素,而selenium会解析整个html文档以定位元素,所以很明显会增加执行时间。

  2. 如果没有可能使用除xpath之外的任何其他定位器,则可以在执行上述操作之前禁用隐式等待。由于您的代码不执行任何操作,如点击刷新已加载的页面,因此不会出现任何与时间相关的问题。只需确保在执行上述操作之前,所需的table dom已完全加载。

  3. 完成上述操作后,不要忘记启用隐式等待。

    会是这样的:

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    List<WebElement> rows = table.findElements(By.xpath("//tbody//tr//td//.."));
    List<ArrayList<String>> rowsData = new ArrayList<ArrayList<String>>();
    
    for(WebElement row:rows){
    List<WebElement> rowElements = row.findElements(By.xpath("//td"));
    
    ArrayList<String> rowData = new ArrayList<String>();
    
    for(WebElement column:rowElements){
        rowData.add(column.getText().toString());
    }
    
    rowsData.add(rowData);}
    return rowsData;
    
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    

答案 2 :(得分:0)

看,这个问题是由于硒的缓慢造成的。如果你使用一些lib来获取html - 相同的算法将以1000倍的速度运行。

主要想法:

  1. 除解析表外,所有都在selenium中工作。

  2. 当您需要解析表格时,请通过Selenium获取此表格的InnerHtml

  3. 通过外部库

  4. 解析此html

    如果是c#,您可以使用HTMLAgilityPack。在java的情况下 - 你需要谷歌它。 通过这种方式,使用相同的解析算法,结果的速度提高了1000多倍。

答案 3 :(得分:-1)

我创建了一篇博客文章和一个描述此类情况的示例github项目 - 它可能有所帮助

http://simpleseleniumnotes.blogspot.com/2015/02/interaction-with-html-tables.html https://github.com/5hawnknight/solid-prototype-table