Selenium XPath查找元素,其中第二个文本子元素包含某些文本(在数组项上使用包含)

时间:2019-06-19 16:37:35

标签: selenium xpath

该页面包含一个多选下拉菜单(类似于以下内容)

multi select dropdown

html代码如下所示:

<div class="button-and-dropdown-div>
<button class="Multi-Select-Button">multi-select button</button>
<div class="dropdown-containing-options>
    <label class="dropdown-item">
        <input class="checkbox">
        "  
                   Name
              "
    </label>
    <label class="dropdown-item">
        <input class="checkbox">
        "  
                   Address
              "
    </label>
</div>

在firefox开发人员工具中进行测试之后,我终于能够弄清楚所需的xPath,以便获取特定标签的文本...

下面的XPath语句将返回文本“ Phone”

$x("(//label[@class='dropdown-item'])[4]/text()[2]")

标签元素中包含多个文本项(尽管在查看UI时看起来只有一个文本对象)。每个标签元素中实际上有两个文本元素。第一个始终为空,第二个包含实际文本(如下图所示,通过Firefox开发人员工具的控制台窗口观察该元素时):

enter image description here

问题:

如何修改上面显示的XPath以便在Selenium的FindElement中使用?

Driver.FindElement(By.XPath("?"));

我知道如何使用包含工具,但显然不使用更复杂的XPath语句。我非常确定以下其中一项可以使用,但不能使用(开发工具抱怨语法错误):

$x("(//label[@class='dropdown-item' and text()[2][contains(., 'Name')]]")
$x("(//label[@class='dropdown-item' and contains(text()[2], 'Name')]")

我正在使用“容器”以避免空白冲突。


其他用于学习的目的(适用于XPath调试)

以防万一有人碰到XPath的新手,我想展示一下这些标签对象的数据结构。您可以使用开发人员工具(F12)中的Firefox控制台窗口来浏览网页中对象的数据结构。如您所见,label元素包含三个子项;文本为空,然后是输入复选框,然后是其他文本,其中有实际文本(不理想)。在下面的图片中,您可以看到网页中与标签数据结构相对应的部分。

enter image description here


2 个答案:

答案 0 :(得分:0)

如果您要查找包含上述HTML的包含“名称”的元素,则可以使用

//label[@class='dropdown-item'][contains(.,'Name')]

答案 1 :(得分:0)

所以终于可以使用了。 Firefox开发人员环境指出XPath字符串存在语法问题时是正确的。

以下XPath字符串最终返回了所需的结果:

$x("//label[@class='dropdown-item' and contains(text()[2], 'Name')]")