繁体   English   中英

Selenium Webdriver Xpath在属性名称中带有点(。)

[英]Selenium webdriver Xpath with dot (.) in attribute name

我有以下html:

<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: .

用这个:

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

不需要mote.id。

也可以使用替代方法

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

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

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

在点之前需要两个\\\\ ,第一个\\才能使第二个通过,而第二个要使点转义以使其变为文字。 尝试\\\\.

您使用的是哪个版本的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中的属性名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM