selenium 如何使用AND条件编写有效的XPath表达式

tvz2xvvm  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(167)

在我们测试的APP的多个环境中,一个元素的ID是不同的。我有这个div ID

CoredataForm:sec2_natural:grid1:left_section_natural:profession:selectProfession_auto_complete_force:ajax

ID的粗体标记部分是对所有环境都相同的部分。
我应该如何编写适合它们的XPath表达式呢?我用了这个

xpath="//div[starts-with(@id,'CoredataForm:sec2_natural:grid1:left_section_natural:profession:selectProfession') and ends-with(@id,'ajax')]"

但这并不管用。也许还有另一个问题:如何将contains()函数与多个通配符一起使用?

d5vmydt9

d5vmydt91#

如果您的工具仅支持XPath 1.0,则您的XPath可能无法工作,因为fn:ends-with在XPath 1.0中不可用
您可以尝试将XPath中的ends-with替换为contains

"//div[starts-with(@id,'CoredataForm:sec2_natural:grid1:left_section_natural:profession:selectProfession') and contains(@id,'ajax')]"
kq0g1dla

kq0g1dla2#

Selify只支持XPath 1,但正如Jason所说,ends-with仅在XPath 2和更高版本中可用。
但是,可以只使用XPath 1函数substringstring-length来检查一个字符串是否以另一个字符串结尾。substring函数返回从特定字符位置开始的子字符串。字符串中的第一个字符的位置为0,因此substring('abc', 1)='bc'
如果字符串$s1以另一个字符串$s2结尾,则以下条件成立:
substring($s1, string-length($s1) - string-length($s2)) = $s2
因此,这个表达式应该适用于您(为了可读性,将其分成多行):

//div[
   starts-with(
      @id,
      'CoredataForm:sec2_natural:grid1:left_section_natural:profession:selectProfession'
   ) 
   and 
   substring(
      @id, 
      string-length(@id) - string-length('ajax')
   ) = 'ajax'
]

相关问题