2016-02-24 25 views
2

我有以下的HTML():硒的webdriver的Xpath與點在屬性名

<table id="oTable"> 
<tbody> 
    <tr mote.id="12345"> 
     <td>Status</td> 
     <td>1</td> 
    </tr> 
    <tr mote.id="54321"> 
     <td>Status</td> 
     <td>2</td> 
    </tr> 
</tbody> 

我想mote.id定位行並單擊第一個td -tag

WebElement element = getDriver().findElement(By.xpath("//tr[@mote.id='12345']/td[1]")); 

但我得到以下錯誤:

Bad token, expected: ] got: . 
+0

嘗試用\脫離你的點。 – Jagdeep

+0

你有沒有'mote.',就像'// tr [@ id ='12345']/td [1]''一樣嘗試使用'xpath'? – Andersson

+0

@Andersson問題是我也有一行parentmote.id =「12345」 – Calle

回答

0

使用此:

findElement(By.xpath("//tbody/tr[1]/td[1]")) 

無需mote.id.的

有替代apporaches以及通過使用

findElements(By.tagName("td")).get(0); 
+0

我認爲Calle可能簡化了他的例子。我懷疑他會問這樣一個簡單的XPath是否可行。 –

+0

這就是@BenChand。有很多行,並且已知的唯一屬性是mote.id – Calle

0

要找到<td>元素,使用:

WebElement element = getDriver().findElement(By.xpath("//td[contains(text(),'Status')]")); 
0

你點之前需要兩個\\,第一\使第二個變通過,第二個逃離點,所以它成爲文字。試試\\.

0

您使用的是哪個版本的Selenium?我在2.52.0(最新的截至目前)和Python上。您的XPath的工作原理:

>>> print driver.find_element_by_xpath("//*[@mote.id='12345']").get_attribute('innerHTML') 

     <td>Status</td> 
     <td>1</td> 
>>> 
>>> print driver.find_element_by_xpath("//tr[@mote.id='12345']/td[1]").get_attribute('innerHTML') 
Status 

或者,你可以寫一個輔助函數來找到所有相關tr元素,然後檢查每個人的mote.id爲你想要的。

>>> def get_mote_by_id(mote_id): 
...  elems = driver.find_elements_by_xpath("//*[@id='oTable']/tbody/tr") 
...  for elem in elems: 
...   if elem.get_attribute('mote.id') == mote_id: 
...    return elem 
... 
>>> 
>>> print get_mote_by_id('12345').get_attribute('innerHTML') 

     <td>Status</td> 
     <td>1</td> 

(這顯然比直接匹配的XPath較慢,但如果它是版本問題,那麼它是一個解決辦法。)是的,它是在Python不是Java,但應該明確的Java版本應該做的事情。

PS:以任何方式讓您的開發人員或產品供應商使用mote_idmoteid而不是mote.id?這將符合HTML和XML中的屬性名稱。