![](/img/trans.png)
[英]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.