但不是前面的例子。如何选择
当属性包含多个单词时,我在按属性选择节点时遇到问题。例如:
<div class="atag btag" />
这是我的 xpath 表达式:
//*[@class='atag']
该表达式适用于
<div class="atag" />
但不是前面的例子。如何选择 <div>
?
div.atag
或 div.btag
。超级简单,不是字符串匹配,而且速度更快(并且在浏览器中得到更好的支持)。 XPath(针对 HTML)应该归结为它对...通过包含的文本查找元素和 DOM 导航有用。
下面是一个查找 className 包含 atag
的 div 元素的示例:
//div[contains(@class, 'atag')]
下面是一个查找 className 包含 atag
和 btag
的 div 元素的示例:
//div[contains(@class, 'atag') and contains(@class ,'btag')]
但是,它也会找到部分匹配项,例如 class="catag bobtag"
。
如果您不想要部分匹配,请参阅下面的 bobince 答案。
mjv 的回答是一个好的开始,但如果 atag 不是列出的第一个类名,则会失败。
通常的方法是相当笨拙的:
//*[contains(concat(' ', @class, ' '), ' atag ')]
只要类仅由空格分隔,而不是其他形式的空格,则此方法有效。几乎总是这样。如果它可能不是,你必须让它更笨重:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
(通过类似类名的空格分隔字符串进行选择是一种常见的情况,令人惊讶的是它没有特定的 XPath 函数,如 CSS3 的 '[class~="atag"]'。)
试试这个://*[contains(@class, 'atag')]
grabatagonabag
怎么办? (提示:它仍然会匹配。)
编辑:请参阅 bobince 的解决方案,该解决方案使用包含而不是开头,以及确保在完整令牌级别完成比较的技巧(以免发现“atag”模式作为另一个“标签”的一部分)。
“atag btag” 是类属性的奇数,但无论如何,请尝试:
//*[starts-with(@class,"atag")]
一个有效的 2.0 XPath:
//*[tokenize(@class,'\s+')='atag']
或使用变量:
//*[tokenize(@class,'\s+')=$classname]
@class
有多个元素,这将如何工作?因为它将返回一个单词列表并将其与字符串进行比较失败,错误的基数。
//*[tokenize(@class)=$classname]
//*[@class=$classname]
请注意,如果您可以假设您感兴趣的类名不是另一个可能的类名的子字符串,那么 bobince 的答案可能过于复杂。如果这是真的,您可以通过 contains 函数简单地使用子字符串匹配。以下将匹配其类包含子字符串“atag”的任何元素:
//*[contains(@class,'atag')]
如果上述假设不成立,则子字符串匹配将匹配您不想要的元素。在这种情况下,您必须找到单词边界。通过使用空格分隔符来查找类名边界,bobince 的第二个答案找到了完全匹配:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
这将匹配 atag
而不是 matag
。
要添加到 bobince 的答案...如果您使用的任何工具/库使用 Xpath 2.0,您也可以这样做:
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
count() 显然是需要的,因为 index-of() 返回它在字符串中匹配的每个索引的序列。
$classname
变量放在引号之间?因为它是一个字符串。
'$classname'
。
您可以尝试以下方法
By.CssSelector("div.atag.btag")
我来这里寻找 Ranorex Studio 9.0.1 的解决方案。那里还没有 contains() 。相反,我们可以使用正则表达式,例如:
div[@class~'atag']
对于包含公共 url 的链接,必须在变量中进行控制台。然后依次尝试。
webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
driver.findelement(allLinks[i]).click();
}
不定期副业成功案例分享
<div class="Patagonia Halbtagsarbeit">
,它包含目标字符串但不是具有给定类的 div。