2017-08-16 105 views
0

我尋求一些幫助,XPath選擇一個後代元素。我已經學習了XPath的基礎知識,但是無法將它們結合起來解決這個問題。量角器/ XPath的 - 查找包含包含文本

所以我在HTML網格包含大約30排,每排(從左至右)都有一個複選框和員工姓名。這裏是行組成的一個片段:

<div class="ui-grid-row ng-scope" data-row-num="21"> //Whole row 
    <div role="row" ui-grid-row="row" class="ng-isolate-scope"> 
    <div role="rowheader" id="1746254927-13-urGrid-005-cell"> //This is checkbox 
    <div role="gridcell" id="17443224958-13-urGrid-005-cell"> 
     <div class="ui-grid-cell-contents ng-binding text-left"> Appleseed, Jonny</div> 

我的目標是要找到:DIV CLASS =「UI格列NG-範圍」數據行NUM =「21」>基於它的後裔包含「Appleseed,Jonny」。從這裏,我將用getAttribute提取data-row-num,然後導航到正確的複選框。

我至今是:

element(by.xpath("//div[@class='ui-grid-row ng-scope') and contains(.//div, 'Appleseed, Jonny')]")); 

有人能幫助指向我在這裏正確的方向?我不是在尋找包含這個文本的元素,而是它的父元素,所以我可以提取它的data-row-num。

或者,如果我能找到包含「蘋果核戰記,強尼」的div元素我怎麼會那麼找到它的父元素(在這種情況下,它不是直接父,但2元了)?

+0

這似乎工作(如果到NG-scope'後'移除多餘的支架)。你能更詳細地描述這個問題嗎? – Andersson

+0

所以每個'行'中有5個div元素。第一個div包含行中的所有div,第二個div包含2個div,其中一個是複選框,另一個是員工姓名,員工姓名div包含另一個具有員工姓名文本的div。這些'行'有幾個,每個都有不同的員工姓名。我想要根據員工姓名在代碼段中看到的頂級div元素。因此,在data-row-num的每個div中都有另一個包含僱員名稱的div,我如何過濾行以返回包含僱員姓名的後代div的行 – Bluejuice

+0

感謝您收集括號,我將其刪除但它仍然無法正常工作 – Bluejuice

回答

0

此XPath應該工作給予HTML提供

//div[@class='ui-grid-row ng-scope'][.//div[contains(.,'Appleseed, Jonny')]] 

它查找包含指定[@class='ui-grid-row ng-scope']類一個DIV,並且還擁有一個孩子DIV包含所需的文本,[.//div[contains(.,'Appleseed, Jonny')]]

我寧願越具體(合理)可能的,例如使用標記名而不是*等等。

既然你提到你正在尋找與該行相關的複選框,另一種方式來做到這一點是尋找直接相對於包含所需的文本元素的複選框。

//div[@role='rowheader'][.//div[contains(.,'Appleseed, Jonny')]] 

因爲我假設你將使用這個XPath無數次,我會把它變成一個功能,並通過所需的文本,例如「Appleseed,Jonny」作爲一個字符串並將其構建到XPath中。

+0

第一個XPath工作,謝謝!然而,量角器不能找到元素,除非它是可見的,我將不得不弄清楚如何將它滾動到視圖中,而不是先定位它。 – Bluejuice

+0

@Bluejuice是關閉屏幕不可見或只是不可見/呈現呢?以下是滾動到元素的量角器示例:https://stackoverflow.com/questions/27023768/scroll-down-to-an-element-with-protractor。如果它還不可見,那麼您應該可以使用WebDriverWait並等到它可見,可點擊等。 – JeffC

+0

直到您向下滾動到該行時,該行纔會顯示。我知道量角器中的一些滾動功能,但他們都需要一個元素來滾動。我無法硬編碼任何東西,因爲員工數量根據測試環境而變化。我還需要選擇總共2名員工,這使其變得更加困難 – Bluejuice