[英]Is there another way to retrieve data from a web service without using JSON?
[英]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中。 無論如何回答您的問題:
如果有可能使用xpath以外的任何其他元素定位器,則可以使用它,這肯定會減少執行時間。 由於您在那里使用過for循環,每個循環都會嘗試使用xpath來定位元素,並且selenium會分析整個html文檔來定位元素,因此顯然會增加執行時間。
如果除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倍的速度運行。
大意:
除了解析表外,其他所有工作都在硒中完成。
當您需要解析表時,通過Selenium獲取該表的InnerHtml
通過外部庫解析此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.