XPath - 如何查找包含输入元素的嵌套li?

5

鉴于这个HTML:

<li class="check_boxes input optional" id="activity_roles_input">
    <fieldset class="choices">
        <legend class="label"><label>Roles</label></legend>
        <input id="activity_roles_none" name="activity[role_ids][]" type="hidden" value="" />
            <ol class="choices-group">
                <li class="choice">
                    <label for="activity_role_ids_104">
                        <input id="activity_role_ids_104" name="activity[role_ids][]" type="checkbox" value="104" />Language Therapist
                    </label>
                </li>
                <li class="choice">
                    <label for="activity_role_ids_103">
                        <input id="activity_role_ids_103" name="activity[role_ids][]" type="checkbox" value="103" />Speech Therapist
                    </label>
                </li>
            </ol>
    </fieldset>
</li>

我将使用Selenium和xpath。
我试图选择第一个“checkbox”输入元素链接。
我在选择该元素时遇到了问题。
我不能使用db ID(104),因为这是针对每次新ID重复测试的。 我需要根据它具有言语治疗师文本来选择“第一个”输入复选框。

我已经尝试过:
xpath=(//li[contains(@id,'activity_roles_input')])//input

并且

xpath=(//li[contains(@id,'activity_roles_input')])//contains('Language Therapist")

但它没有找到该元素。

当我执行以下操作时:

xpath=(//li[contains(@id,'activity_roles_input')])

这段文字涉及IT技术,意思是想要选择'语言治疗师'的第一个复选框控件,但目前存在问题。请注意保留原有的HTML标签。

4个回答

11

首先,找到包含该文本的任何<li>元素,然后在这些元素的后代中查找第一个复选框。

xpath=(//li[contains(., "Language Therapist")]/descendant::input[@type="checkbox"][1])

(来自 Michael)

以上方法对我起了作用。最终,我实际上使用了

xpath=(//li[contains(@id,'activity_roles_input')]/descendant::input[@type="checkbox"][1])

因为我喜欢通过CSS ID进行标识。


对我有效(我发布了这个问题)。 - Michael Durrant

1

当我尝试对您的XML运行此小型XSL时,有一个有趣的事实需要注意。

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>

<xsl:template match="/">
   <xsl:for-each select="//li[@id ='activity_roles_input']">
      <xsl:value-of select="."/>
   </xsl:for-each>       
</xsl:template>

</xsl:stylesheet>

输出:

    Roles




                    Language Therapist




                    Speech Therapist

0

你有

xpath=(//li[contains(@id,'activity_roles_input')])//input

这不应该是这样吗?

xpath=(//li[contains(@id,'activity_roles_input')]//input)

或者说

xpath=(//li[@id='activity_roles_input']//input)

?


-1
xpath=(//li[@id='activity_roles_input']//input[1])

2
请勿发布裸代码答案。在您的代码中加入一些解释说明。 - Jonathan Mee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接