为不同的" span"中的整个文本写出可点击的xpath。标签,但在一个" p"标签

时间:2015-02-25 11:43:09

标签: html ruby xpath watir watir-webdriver

我写的是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)

2 个答案:

答案 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的答案这样的方法。