2012-09-10 131 views
2

使用硒的webdriver爲FF/IE使用C#(.NET)無法找到CSS選擇元素

下面是我的頁面的源代碼,我試圖用CssSelector找到/包含特定的名字從我的網頁我試着用下面的代碼,但導致錯誤,任何幫助?

//代碼

driver.FindElement(By.CssSelector("td:contains('John John')")) 

//錯誤:

e {"Unable to find element with css selector == td:contains('John John')"} System.Exception {OpenQA.Selenium.NoSuchElementException} 

//我的html代碼:

<div id="ctl00_ContentPlaceHolder1_AddeCardControl1_gv_ctl01_RecordCount" style="float:right; padding-right:10px; margin-top:3px;"> 
    <b>308</b> Items Found 
</div> 
</td> 
</tr> 
<tr class="item"> 
<td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$0')">Edit</a></td> 
<td align="center" style="width:15px;"></td> 
<td>John John</td> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td><img src="check.png" alt='Active' style='display: ;' /></td> 
<td>9/7/2012 11:15:08 PM</td> 
</tr> 
<tr class="altItem"> 
<td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$1')">Edit</a></td> 
<td align="center" style="width:15px;"></td> 
<td>John Schulz</td> 
<td>&nbsp;</td> 
<td>Visitors</td> 
<td>&nbsp;</td> 
<td><img src="check.png" alt='Active' style='display: ;' /></td> 
<td>9/7/2012 6:28:29 PM</td> 
</tr> 
<tr class="item"> 
<td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$2')">Edit</a></td> 
<td align="center" style="width:15px;"></td> 
<td>Parker Smith</td> 
<td>&nbsp;</td> 
<td>Visitors</td> 
<td>&nbsp;</td> 
<td><img src="check.png" alt='Active' style='display: ;' /></td> 
<td>9/7/2012 6:01:28 PM</td> 
</tr> 
<tr class="altItem"> 
<td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$3')">Edit</a></td> 
<td align="center" style="width:15px;"></td> 
<td>Test 123</td> 
<td>&nbsp;</td> 
<td>Visitors</td> 
<td>&nbsp;</td> 
<td><img src="check.png" alt='Active' style='display: ;' /></td> 
<td>9/7/2012 1:36:45 PM</td> 
</tr> 
<tr class="item"> 
<td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$4')">Edit</a></td> 
<td align="center" style="width:15px;"> 

回答

0

你可以試試這個

var webElements = (Driver.FindElements(By.XPath(elementXpath))).ToList(); 
webElements.FindIndex(item => item.Text.Contains("John John").Click() 

其中「elementXpath」在表中「名」的路徑每個單元格。所以你得到名單的名單,然後找到一個匹配。你會得到你的物品點擊。

+0

什麼是webElements?它是IWebElements嗎?我嘗試使用'IWebElements',但是拋出錯誤... Error \t''OpenQA.Selenium.IWebElement'沒有包含'FindIndex'的定義,也沒有包含接受類型'OpenQA'的第一個參數的擴展方法'FindIndex'。 Selenium.IWebElement'可以找到(你是否缺少使用指令或程序集引用?)' –

+0

對不起,這是我的錯,當然,它是一個變量。 我更正了帖子。 –

+0

與讓XPath引擎爲您選擇正確的元素相比,這將非常低效。 XPath「contains()」函數是完成此操作的正確方法。 – JimEvans

1

的:含有pseudoselector不是W3C CSS選擇器的一部分標準。因此,瀏覽器不支持使用它選擇元素。一些JavaScript CSS選擇器引擎(例如,jQuery所使用的引擎Sizzle)提供了一個:包含僞選擇器,但其存在不能依賴。

如果您必須通過元素的文本內容找到元素,那麼此時唯一的解決方案是使用XPath。如何找到這在你的情況A(性能極差)的例子是如下:

IWebElement element = driver.FindElement(By.XPath("//td[contains(., 'John John')")); 

需要注意的是一個更好的解決方案將永遠有你有自動化的元素正確編號的應用程序,您需要找到。您應該使用文本來查找元素僅作爲最後的手段。

+0

吉姆,我聽你的,什麼是該方法的最佳辦法? –

+0

這是您必須依賴XPath作爲選擇器的少數案例之一。否則,請修復該網站以提供您要查找的​​元素的正確ID。 – JimEvans

+0

嘗試了你的最新代碼,得到這個錯誤消息'xpath表達式'// td [包含(。,'John John')'無法在WebElement中評估或不結果' –

0

使用javascript執行程序單擊元素可能會有更好的運氣。我使用的是一個非常慢的IE9 64位仿真器,似乎點擊某些按鈕的唯一方法是使用JavaScript執行程序。

+0

ie9 64位模擬器?你是什​​麼意思 –

+0

對不起。 IE9 64bit驅動程序。我正在使用在64位上運行的IEdriver。 – obesechicken13

0

CSS選擇器在這裏並不是很有用,因爲CSS選擇器在html結構上工作,即web元素的類型,關係和屬性;它們在html內容上效果不佳,在這種情況下,它是內部文本內容「John John」。

但是,xpath將爲這項工作。你需要的功能是text()返回該元素的內部文本內容:

//td[text()='John John'] 

所以,你的webdriver代碼應該是這樣的:

driver.FindElement(By.xpath("//td[text()='John John']")); 

附:所有定位器在Firefox中使用Firepath進行驗證。

-1

您可以使用下面的代碼:

driver.FindElement(By.XPath("//td[contains(text(), 'John John')"));