如何在XPath中找到<span>元素</span>

时间:2014-02-17 06:14:06

标签: xpath selenium-webdriver

我的HTML代码如下所示:

<html>
    <body>
        <div>
        </div>
        <div>
            <table>
                <tbody id=a>
                    <tr>
                        <td>
                            <div>
                                <span>
                                   some Text
                                </span>
                            </div>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <div>
                                <span>
                                   some Text2
                                </span>
                            </div>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <div>
                                <span>
                                   some Text3
                                </span>
                            </div>
                        </td>
                    </tr>
              </tbody>
       </table>
   </div>
</body>

我正在尝试按文字选择每个span元素。我可以通过id选择tbody。我试过这个:

tbody.FindElement(By.XPath(String.Format(".//span[contains(text(), {0}))]", &var)));  
(var = somex0020Text)

但这总是会返回表格中的第一个<span>元素。

我也尝试过:

tbody.FindElements(By.XPath(String.Format(".//span[contains(text(), {0}))]", &var))); 

返回了一个包含表格中每个<span>元素的列表,我不知道为什么。

我也不明白为什么

tbody.FindElement(By.XPath(String.Format(".//span[text() =  {0})]", &var)));   
当contains方法返回一个只有相同文本的<span>元素时,

抛出一个Element not found Exception。

5 个答案:

答案 0 :(得分:2)

我尝试使用xpath作为:

.//span[contains(text(),'some Text')]

它正在选择所有3个跨度。

所以我已经引用了父元素。

第一个范围

.//tbody[@id='a']//tr[1]//span[contains(text(),'some Text')]

代表第二名:.//tbody[@id='a']//tr[2]//span[contains(text(),'some Text')]

代表第3名:.//tbody[@id='a']//tr[3]//span[contains(text(),'some Text')]

通过这个我可以单独选择每个span元素。

答案 1 :(得分:0)

您可以使用jQuery获取“Table”中的所有span元素。

示例:

    var items = $('table div span');
    items.each(function (x) {
        alert(items[x].innerHTML);
    });

答案 2 :(得分:0)

  

tbody.FindElement(By.XPath(String.Format(“.// span [contains(text(),{0}))]”,&amp; var)));
  (var = somex0020Text)

     

但这总是返回我表格中的第一个元素。

这是Selenium中的预期行为。正如我所看到的,有3个元素具有与代码中提到的相同的xpath,在这种情况下 Selenium返回第一个元素

  

tbody.FindElements(By.XPath(String.Format(“.// span [contains(text(),{0}))]”,&amp; var)));

     

返回了一个包含我表中每个元素的列表,我不知道为什么。

这也是expected behavior in SeleniumFindElements将返回具有相同xpath的所有元素。

因此,请将var的值更改为some Text2some Text3以找到其他两个元素。

以下xpath适用于some Text2

.//span[contains(text(), 'some Text2'))]

答案 3 :(得分:0)

尝试使用此Xpath $ x(“// tr // span [contains(。,'some text')]”)

答案 4 :(得分:0)

据我所知,您在使用 contains 时遇到了问题。所有 3 个跨度都包含这个“一些文本”部分。

如果要检查整个字符串,可以使用 .//span[text()='some Text']

希望这会有所帮助,并享受网络解析的乐趣!