2016-06-22 18 views
0

我正在開展我的第一個硒項目,我碰到了一些路障。我有一個包含3個不同表格的網頁。我只想從這些表中的一箇中提取數據。我面臨的問題是使用引導程序來設置這些頁面的樣式,因此所有表格都共享相同的類別,並且它們都沒有可以專門搜索的標識。我可以通過在tr/td中搜索xpath來在不同的頁面上執行此操作,但由於多個表,因此不適用於此頁面。檢查網頁的源文件爲表我想拉數據從我得到類似如下:找到一個沒有ID的特定表

<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")); 

&&運營商這裏不允許使用。

如果任何人有任何想法讓我進入正確的方向,我將不勝感激。

+0

FYI' 「COL-MD-4」'是'的'div'不'id' ...你應該有這個'xPath'嘗試...'名單 TableElems的class'屬性= chrome.findElements(By.xpath(「// div [@ class ='col-md-4']/descendant :: td」));' –

+0

我編輯過,謝謝。 –

回答

2

您可以使用此XPath表達式:

"//div[@class='col-md-4']//tr/td" 

您嘗試不同的是tr之前使用class屬性(沒有ID)和雙斜線的允許tr是後代div[@id='col-md-4']任何深度的元素,而不只是一個直接的孩子。

+0

我做了這些編輯。我不認爲這是正確的方法 - 它仍然沒有做任何事情。 –

+0

@JMullen鑑於您的數據,這很難重現。但無論如何,你應該真的投資學習XPath表達式或CSS選擇器(請參閱@Carele的答案)。否則,你只是迷失在盲目嘗試獲得解決方案。 – wero

+0

嗨 - 我收回它。我在編輯時發生了錯誤。這是正確的 - 謝謝。 –

0

嘗試是這樣的:

//table[contains(concat(" ", normalize-space(@id), " "), " table-striped table-bordered"][//td[contains(text() , "info1")]])[1]

+0

你能解釋一下嗎? –

+0

按表包含您搜索名稱爲「table-striped talbe-bordered」的表類,因此您不會搜索整個文檔。 然後,您在td中搜索包含文本「info1」的td,並通過[1]選擇第一個元素 – Rivalez

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,要小心。

+0

這裏的'>'字符在這裏做什麼?我是硒新手,我正在學習語法。我還沒有看到。 –

+0

這是一個CSS選擇器,表示第二個類是第一個類的直接子類(如果不使用它,即使該tr在另一個div或類似的東西中,也可以從td中選擇任何td後代) 。如果你想在tr下面得到任何td,就把它壓制下來。否則,你可以省略它,但是我可以隨時添加它們。這是一種額外的安全措施。 – Carele

0

您可以在xpath下使用它們的位置來獲取每個表的值。

.//table[1]/descendant::tr/td -for table 1 
.//table[2]/descendant::tr/td -for table 2 
0

你可以試試這個XPath

/html/body/div/div/div/table/tbody/tr[1]/td[text()='info3']/../../.. 

,如果你想選擇的表,如果你要選擇的TD 的TD後取出剩下的[文本()='INFO3 「]

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 
}