簡體   English   中英

使用webdriver從Web表中檢索列數據的更好方法

[英]Better way to retrieve columns data from a Web table using 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;

我認為對於較大的html解析, JSoup是更好的選擇。 它提供與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;

首先,您的問題對我來說有點令人驚訝,它是如何工作的? 你有. 在xpaths中,據我所知硒確實需要. 在xpath中。 無論如何回答您的問題:

  1. 如果有可能使用xpath以外的任何其他元素定位器,則可以使用它,這肯定會減少執行時間。 由於您在那里使用過for循環,每個循環都會嘗試使用xpath來定位元素,並且selenium會分析整個html文檔來定位元素,因此顯然會增加執行時間。

  2. 如果除xpath之外無法使用其他任何定位器,則可以在執行上述操作之前禁用隱式等待。 由於您的代碼不會執行任何操作(如單擊),因此會刷新加載的頁面,因此不會出現與時間有關的任何問題。 只需確保在執行上述操作之前,已完全加載table dom。

完成以上操作后,不要忘記啟用隱式等待。

它將是這樣的:

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

看,問題是由硒慢引起的。 如果您將使用一些lib來獲取html,則相同的算法將以1000倍的速度運行。

大意:

  1. 除了解析表外,其他所有工作都在硒中完成。

  2. 當您需要解析表時,通過Selenium獲取該表的InnerHtml

  3. 通過外部庫解析此html

如果是c#,則可以使用HTMLAgilityPack。 如果是Java,則需要將其谷歌搜索。 通過這種方法,使用相同的解析算法,我得到的結果要快1000倍以上。

我創建了一個博客文章和一個示例github項目來描述這種情況-這可能會有所幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM