我写的是xpath
,但我认为它不是最佳xpath expression
。
//div[contains(@class,'config')]/a[contains(.,'student')]/../p[contains(.,'Never logged as ') and contains(.,'admin')]
HTML就是这样:
<div class="config">
<a class="something student something " href="something" htmlelement = "something">
<div class="bla bla"/>
<div class="bla bls> xyz </div>
<div class="bla blab">abc</div>
<span>Allow it</span>
</a>
<p>
<span>Never logged as</span>
<span class="b">admin.</span>
<img src="/images/info.png"/>
</p>
<div class="bla bla">qwerty</div>
</div>
现在我想要的是像这样写一个通用的xpath
:
//div[contains(@class,'config')]/a[not(contains(.,'#{$role_type}'))]/../p[contains(.,'#{$condition}')]
并点击此处:
@browser.link(:xpath => my_xpath).when_present.click
我只传递上面xpath
“role_type”和“condition”中的两个参数,但是当我这样做时,它无法识别它,因为文本“admin”在另一个范围内。
那么如何收集整个跨度文本?我也尝试了这个XPath expression for selecting all text in a given node, and the text of its chldren帖子,但是这里它给出了字符串作为输出,但我希望可点击的元素不是字符串。
我正在使用WATIR(Ruby + Cucumber)
答案 0 :(得分:1)
我认为使用XPath可能会运气不好,因为我不相信有字符串连接功能(至少在XPath 1.0中)。
相反,我会使用其他Watir和Ruby方法。例如,以下内容将遍历config div元素并找到包含角色链接和条件文本的元素。然后,您可以从找到的元素中单击其链接。
$role_type = 'student'
$condition = 'Never logged as admin.'
config = browser.divs(class: 'config').find do |div|
div.link(class: $role_type).exists? && div.p(text: $condition).exists?
end
config.link.click
答案 1 :(得分:0)
如果您只想找到&#34;从未以管理员身份登录的第一个链接&#34;,那么
@ browser.p(:text =&gt;&#34;从未以管理员身份登录&#34;)。parent.link.click
否则,可能需要像Justin的答案这样的方法。