我使用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 =“// input [contains(@ 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);
我注意到我似乎无法使用以下开头 - 使用/ contains来定位dom中的任何元素,但是如果我使用完整的id,它就可以工作。
//Partial ID - fails
//*[starts-with(@id,"quantity_")]
//Exact ID - works
//*[starts-with(@id,"quantity_-112409575185705")]
答案 0 :(得分:0)
生成的输出you pasted here根本不包含字符串number_
。它 包含Number_
- 注意大写N
- 但它不是字符串的第一部分。也许你的意思是这样的(至少选择某事):
(//input[contains(@id, 'Number_')])[2]
或者:
(//input[starts-with(@id,'catalogNumber_')])[2]
答案 1 :(得分:0)
正如Iwburk所说,这是命名空间问题。根据Selenium API,
在使用xpath表达式时,我需要使用xpath = xpathExpression将我的查询字符串更改为:
String path = "xpath=(//input[starts-with(@id,'quantity_')])[2]";
我在这里发现了相关的帖子, Element is found in XPath Checker but not in Selenium
答案 2 :(得分:0)
您无法访问它,因为您没有将该元素定位为在页面中是唯一的。 使用一个使它独特的xpath, - 你的xpath看起来不错。 更多信息在这里 http://www.seleniumhq.org/docs/appendix_locating_techniques.jsp
答案 3 :(得分: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