获取一行内按钮的xpath

xpath for obtaining button within a row

我用 splinter 编写了一些浏览器测试,并且有一个页面有 clearly-defined 行,其中包含自己的标题、按钮等。类似于:

在我的特殊情况下,我可以获得如下一行:

row = lambda title: browser.find_by_xpath("//div[@class='my-row'][contains(., '{0}')]".format(title))

row1 = row('Row 1')
row2 = row('Row 2')

然后,用这个兰巴:

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text))

我可以磨练正确的常规按钮或说出类似的话:

assert button(row1, 'Special button')
assert not button(row2, 'Special button')

但是当我调用按钮 lambda 时,它 returns 来自其他行的按钮。

据我了解,通过 xpath 通过此 lamba 查找表示,"starting from elmt, look for buttons nested within elmt that contain the given text"。但是,由于我从未嵌套在当前行中的其他行中获取内容,所以我在这里缺少什么?

我的 xpath 有什么问题?

// 开头的 XPath 表达式从文档的 root 节点和 select 节点开始,无论它们在文档中的位置如何。此类表达式的当前上下文节点,例如

//div

对返回的结果集没有影响。要从上下文节点开始搜索 // (descendant-or-self::) 轴,您需要使用

.//div

在你的情况下,这意味着改变

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text))

button = lambda elmt, text: elmt.find_by_xpath(".//a[@class='btn'][contains(.,'{0}')]".format(text))

(警告:这就是关于您代码中的 XPath 表达式的所有内容,我无法对其余部分发表评论。)