查找没有ID

时间:2016-06-22 12:25:56

标签: java html selenium xpath html-table

我正在研究我的第一个硒项目,我遇到了一些障碍。我有一个包含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>

所以这引出了我的问题,我不知道我可以用什么来只选择这个表。如果我搜索trtd,我也会从页面上的其他表格中获取数据。

我看到这个表的唯一独特功能是<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"));

但此处不允许使用&&运算符。

如果有人有任何想法让我指向正确的方向,我将不胜感激。

6 个答案:

答案 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
}