2014-12-19 29 views
1

硒似乎不能在我用下面的代碼所指定的表,找出一個輸入元件:硒表定位小區使用CSS

driver.findElement(By.cssSelector("td:contains('Community Member')+td+td>input:contains('ACTION_DELETE')")).click(); 

它拋出InvalidSelectorException。下面是該行的頁面源代碼段我的工作:

<tr id="aui_3_2_0_1240" class="portlet-section-alternate results-row alt lfr-role lfr-role-community last"> 
    <td class="align-left col-1 first valign-middle" headers="issq_col-1" colspan="1"> Community Member </td> 
    <td class="align-left col-2 valign-middle" headers="issq_col-2" colspan="1"> 
    <td id="aui_3_2_0_1239" class="align-left col-3 valign-middle" headers="issq_col-3"  colspan="1"> 
     <input id="aui_3_2_0_1211" type="checkbox" name="10124_ACTION_DELETE"/> 
    </td> 
    <td class="align-left col-4 valign-middle" headers="issq_col-4" colspan="1"> 
    <td class="align-left col-5 valign-middle" headers="issq_col-5" colspan="1"> 
    <td class="align-left col-6 valign-middle" headers="issq_col-6" colspan="1"> 
    <td class="align-left col-7 valign-middle" headers="issq_col-7" colspan="1"> 
    <td class="align-left col-8 valign-middle" headers="issq_col-8" colspan="1"> 
    <td class="align-left col-9 last valign-middle" headers="issq_col-9" colspan="1"> 
</tr> 

,我試圖以智能點擊由輸入上述要素表示的複選框。我應該注意到,上面所有的td都是可擴展的,以顯示輸入元素。理想情況下,我想要的只是一些代碼,我可以給出行中第一個單元格的值以及複選框的部分名稱,並讓它爲我單擊複選框。在上面的例子會是這樣......

clickCheckboxInTable("Community Member","ACTION_DELETE"); 

任何建議,如何更好地做到這一點或修復我的現有代碼?

+1

ü可以嘗試用'輸入[姓名* =「ACTION_DELETE」]' –

回答

5

您正在嘗試使用:contains pseudoselector在你的CSS選擇器。這個假選擇器不是任何公佈的CSS標準的一部分。不幸的是,由於jQuery使用的JavaScript CSS選擇器引擎實現(Sizzle)允許它被使用,所以它變得很常見。由於驅動程序實現依賴於瀏覽器的本機CSS選擇器引擎實現,因此它們不支持:contains假選擇器,並拋出您看到的異常。另外,我注意到你試圖找到name屬性(不是元素內容)包含你正在搜索的字符串的複選框。在這種情況下,:contains無論如何不會起作用。

撇開使用其中包含的文本發現元素的內在不穩定性,如果您真的想這樣做,那麼通過XPath查找可能是您唯一的選擇。另外,複選框元素不是包含要查找的文本的元素的後代。相反,它是一個兄弟元素,CSS選擇器不允許您將DOM樹上移到父元素。再次,這是XPath最好處理的一個功能。

我會使用類似如下處理這個問題:

public void clickCheckboxInTable(String value, String action) { 
    // Assume the WebDriver instance is stored in a class-level 
    // variable named 'driver'. 
    WebElement tableCell = driver.findElement(By.xpath("//td[contains(., '" + value + "')]")); 
    WebElement checkbox = tableCell.findElement(By.xpath("..//input[contains(@name, '" + action + "')]")); 
    checkbox.click(); 
} 

注意細心一點,這個解決方案執行兩個發現。如果需要,分兩步進行操作可以讓您有機會執行與包含您的價值的單元格相關的其他操作。否則,你可以使用一個XPath表達式是這樣的:

// Using the 'direct parent' operator ('..'), but you could also 
// use other axis functions like 'following-sibling'. 
findElement(By.xpath("//td[contains(., '" + value + "')]/..//input[contains(@name, '" + action + "')]")); 
+0

我得感謝上述解釋@Jim。我一直在思考爲什麼''contains''沒有在cssSelector中使用。 Et Voila!以上澄清我現在.. :) – Subh

+0

@JimEvans非常感謝您的出色答案和見解。說明。如果你想在你的答案中刪除沒有經過測試的代碼的外延,它就可以很好地工作。 – user2150250

0

嘗試用這個XPath:

//*[@type='checkbox'][contains(@name,'_ACTION_DELETE')] 

編輯

//*[normalize-space(text())='Community Member']/input[@type='checkbox'][contains(@name,'_ACTION_DELETE')] 

enter image description here

編輯:吉姆·埃文斯意見後修正

//*[normalize-space(text())='Community Member']/..//input[@type='checkbox'][contains(@name,'_ACTION_DELETE')] 
+0

請問這個區別,雖然這個特定的行?這只是具有相同輸入單元格的許多行中的一行,全都具有ACTION_DELETE複選框。我需要通過它的第一列「社區成員」中的值區分這一行。 – user2150250

+0

這個答案取決於你提供的'tr'嗎?該頁面是否包含更多具有相同屬性的「tr」? – Saifur

+0

是的,這是一個多行表。爲了簡潔起見,我只包括了我正在使用的那一行。 – user2150250

0

嘗試使用此xpath點擊相關的「社區會員」複選框:

driver.findElement(By.xpath("//td[contains(text(),'Community Member')]/following-sibling::td/input[contains(@name,'ACTION_DELETE')]")).click();