xpath - 如何在其中找到带有输入元素的嵌入式li?

时间:2012-12-04 20:28:12

标签: xpath

鉴于此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。 我正在尝试选择第一个“复选框”输入元素链接 我在选择元素时遇到问题 我不能使用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')])

它到达输入集。我遇到的问题是为“语言治疗师”选择第一个输入复选框控件。

4 个答案:

答案 0 :(得分:10)

首先,查找包含文本的任何<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识别ID。

答案 1 :(得分: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

答案 2 :(得分:0)

你有

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

不应该是

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

或者更确切地说

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

答案 3 :(得分:-1)

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