4

我使用 AjaxFormLoop 生成了以下 HTML。

<div id="phones">
    <div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdd8b6">
        <input id="number_13b87fdd8b6" name="number_13b87fdd8b7" type="text"/>
        <a id="removerowlink_13b87fdd8b6" href="#" name="removerowlink_13b87fdd8b6">remove</a>
    </div>
    
    <div class="t-forminjector tapestry-forminjector" id="rowInjector_13b87fdda70" style="background-image: none; background-color: rgb(255, 255, 251);">
        <input id="number_13b87fdda70" name="number_13b87fdda70" type="text" />
        <a id="removerowlink_13b87fdda70" href="#" name="removerowlink_13b87fdda70">remove</a>
    </div>
</div>

我正在尝试使用部分 ID 访问子 2 中的第二个输入字段,但是我没有成功地让它工作。

到目前为止我所尝试的。

String path = "//input[contains(@id,'number_')][2]";
String path = "(//input[contains(@id,'number_')])[2]";

我什至不能使用 1 而不是 2 访问输入 1,但是如果我删除 [2] 并且只使用

String path = "//输入[包含(@id,'number_')]";

我可以毫无问题地访问第一个字段。

如果我使用确切的 ID,我可以毫无问题地访问任一字段。

如果可能,我确实需要使用 id,因为每个 t-forminjector 行中有更多字段在此示例中不存在。

使用 Selenium 实现。

    final String path = "(//input[starts-with(@id,'quantity_')])[2]";
    
    new Wait() {
        @Override
        public boolean until() {
            return isElementPresent(path);
        }
    }.wait("Element should be present", TIMEOUT);

解决

我注意到我似乎无法使用以下开头/包含来定位 dom 中的任何元素,但是如果我使用完整的 id,它就可以工作。

//Partial ID - fails
//*[starts-with(@id,"quantity_")]

//Exact ID - works
//*[starts-with(@id,"quantity_-112409575185705")]
4

4 回答 4

0

As Iwburk stated, this was a namespace issue. According to the Selenium API,

http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/Selenium.html

while using an xpath expression, I needed to used xpath=xpathExpression changing my query string to:

String path = "xpath=(//input[starts-with(@id,'quantity_')])[2]";

I found a related post here, Element is found in XPath Checker but not in Selenium

于 2012-12-11T22:55:28.943 回答
0

您无法访问它,因为您没有将元素定位为在页面中是唯一的。使用使其独一无二的 xpath,-您的 xpath 看起来不错。更多信息在这里 http://www.seleniumhq.org/docs/appendix_locating_techniques.jsp

于 2015-03-12T09:42:15.023 回答
0

您在此处粘贴的生成输出根本不包含其中number_任何位置的字符串。它确实包含Number_——注意大写N——但它不是字符串的第一部分。也许你的意思是这样的(至少选择了一些东西):

(//input[contains(@id, 'Number_')])[2]

或者:

(//input[starts-with(@id,'catalogNumber_')])[2]
于 2012-12-11T20:11:27.000 回答
0

除了 selenium 语法问题之外,还有一个与标记结构相关的 xpath 问题。
xpath 1://input[starts-with(@id,'number_')][1]
xpath 2:(//input[starts-with(@id,'number_')])[1]

在下面的示例中,xpath 1 将返回 2 个节点(不正确),而 xpath 2 将是正确的,因为input节点不是兄弟节点,因此需要使用括号来引用生成的节点集

<div id="phones">
    <div>
        <input id="number_1" name="number_1" type="text"/>
    </div>
    <div>
        <input id="number_2" name="number_2" type="text" />
    </div>
</div>

不带括号的结果

/ > xpath //input[starts-with(@id,'number_')][1]
Object is a Node Set :
Set contains 2 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=number_1
    ATTRIBUTE name
    TEXT
        content=number_1
    ATTRIBUTE type
    TEXT
        content=text
2  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=number_2
    ATTRIBUTE name
    TEXT
        content=number_2
    ATTRIBUTE type
    TEXT
        content=text

在下一个示例中,括号不会产生影响,因为节点是兄弟节点

<div id="other">
<input id="pre_1" type="text"/>
<input id="pre_2" type="text" />
<div>a</div>
</div>

带括号

/ > xpath (//input[starts-with(@id,'pre_')])[1]
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=pre_1
    ATTRIBUTE type
    TEXT
        content=text

不带括号

/ > xpath //input[starts-with(@id,'pre_')][1]
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT input
    ATTRIBUTE id
    TEXT
        content=pre_1
    ATTRIBUTE type
    TEXT
        content=text

测试是用 xmllint shell 完成的 xmllint --html --shell test.html

于 2018-04-27T23:59:29.313 回答