2

我正在尝试使用软件名称 Selenium (web rat) 来模拟用户与浏览器的交互

例如,我试图将用户名字段命名为 'john

但是“用户名文本框”的“id”是 username_947232, username_8237

其中 username_[随机数] 的格式

我的语法如下:

//*[contains(@id="username_(/\d+/)")]

但它不起作用,有人知道吗?

感谢您的任何建议!

4

3 回答 3

3

使用

//*[starts-with(@id, 'username_')
  and 
   floor(substring-after(@id, 'username_')) = substring-after(@id, 'username_')
    ]

说明

此表达式选择其属性的字符串值以id字符串开头且该字符串"username_"的其余部分(在开始之后"username_")是整数的任何元素。

$string这里我们使用以下表达式为真当且仅当表示一个整数的事实:

floor($string) = $string

基于 XSLT 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:copy-of select=
      "//*[starts-with(@id, 'username_')
  and
   floor(substring-after(@id, 'username_')) = substring-after(@id, 'username_')
    ]
    "/>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于此 XML 文档时

<t>
 <user id="username_Xyz"/>
 <user id="username_Xyz123"/>
 <user id="username_123Xyz"/>
 <user id="username_123Xyz456"/>
 <user id="username_2015"/>
</t>

对 Xpath 表达式求值,并将从该求值中选择的节点复制到输出:

<user id="username_2015"/>

请注意:此问题的其他两个答案user将从上述文档中选择所有 5 个元素——这当然是不正确的。

于 2012-10-26T15:13:47.127 回答
0

采用starts-with

//*[starts-with(@id, "username_")]
于 2012-10-26T08:28:51.650 回答
-1

你应该可以使用

//*[contains(@id, 'username_')]

虽然如果你最后可能有除数字以外的任何东西,这可能不是最佳选择。

于 2012-10-26T06:51:50.717 回答