我正在尝试将表中的数据提取到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;
答案 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中需要.
。无论如何回答你的问题:
如果有可能使用除xpath之外的任何其他元素定位器然后使用它,它肯定会减少执行时间。由于你已经在那里使用了循环,每个循环都会尝试使用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);
答案 2 :(得分:0)
看,这个问题是由于硒的缓慢造成的。如果你使用一些lib来获取html - 相同的算法将以1000倍的速度运行。
主要想法:
除解析表外,所有都在selenium中工作。
当您需要解析表格时,请通过Selenium获取此表格的InnerHtml
通过外部库
如果是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