我正在研究我的第一个硒项目,我遇到了一些障碍。我有一个包含3个不同表格的网页。我只想从其中一个表中提取数据。我面临的问题是引导程序用于设置这些页面的样式,因此所有表共享同一个类,并且它们都没有我可以专门搜索的id。我能够通过搜索tr / td的xpath在不同的页面上执行此操作,但由于多个表,因此不适用于此页面。检查表的页面源我想从中提取数据,我得到如下内容:
<div class="col-md-4">
<div class="panel panel-success">
<div class="panel-panel-heading>
<h3 class="panel-title">table title</h3>
</div>
<div class="table-responsive">
<table class="table-striped table-bordered">
<thead>...</thead>
<tbody>
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<td class="ng-binding">info1</td>
<td class="ng-binding">info2</td>
<td class="ng-binding">info3</td>
<td class="ng-binding">info4</td>
</tr>
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
</tbody>
</table>
</div>
所以这引出了我的问题,我不知道我可以用什么来只选择这个表。如果我搜索tr
或td
,我也会从页面上的其他表格中获取数据。
我看到这个表的唯一独特功能是<div class="col-md-4">.
我不知道是否可能,但我的想法是进行某种组合搜索以转到这个特定的div,然后转到xpath tr / td从表格的每个单元格中提取数据,但我是硒新手,我不知道该怎么做。我正在查看的文档似乎并没有显示如何将多个策略组合在一起,而且我在搜索谷歌搜索时遇到问题,所以我还没有找到一个谷歌链接,这让我对如何使用这样做。
我尝试过这样的事情,但我认为我的语法不正确
List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']//tr/td"));
我也试过
List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']" && "//tr/td"));
但此处不允许使用&&
运算符。
如果有人有任何想法让我指向正确的方向,我将不胜感激。
答案 0 :(得分:2)
您可以使用此xpath表达式:
"//div[@class='col-md-4']//tr/td"
您尝试的不同之处在于使用class
属性(没有id)和tr
之前的双斜杠,它允许tr
成为div[@id='col-md-4']
的后代元素{1}}任何深度,而不仅仅是直接的孩子。
答案 1 :(得分:1)
尝试使用“find_element_by_css_selector”方法。如果您遇到类似的问题而没有特定的类,也可以使用CSS选择器“nth-child”。 上课:
By.css(".col-md-4 tr > td")
如果所有表都有col-md-4类,如果你想要一个页面的第三个表:
By.css(".col-md-4:nth-child(3) tr > td")
另外,您为xpath请求提供id
属性,但“col-md-4”为class
,请注意。
答案 2 :(得分:0)
尝试这样的事情:
//table[contains(concat(" ", normalize-space(@id), " "), " table-striped table-bordered"][//td[contains(text() , "info1")]])[1]
答案 3 :(得分:0)
您可以使用xpath下方的位置获取每个表的值。
.//table[1]/descendant::tr/td -for table 1
.//table[2]/descendant::tr/td -for table 2
答案 4 :(得分:0)
你可以尝试这个Xpath
/html/body/div/div/div/table/tbody/tr[1]/td[text()='info3']/../../..
如果您要选择表格,以防您想要选择td 在td [text()='info3']
之后删除其余部分答案 5 :(得分:0)
我在这些情况下通常会先找到表格元素:
List<WebElement> tables = (List<WebElement>)chrome.findElements(By.className("table-responsive"));
然后得到你想要的确切表格:
WebElement table = tables.get(i);
您可以重复此操作并使用循环来获得所需的确切数据。
List<WebElement> dataElements = (List<WebElement>)chrome.findElements(By.className("ng-binding"));
for (int i=0; i<dataElements.size(); i++) {
String data = dataElements.get(i).getText();
//Do something with data
}