1

我用 splinter 编写了一些浏览器测试,并有一个包含明确定义的行的页面,其中包含它们自己的标题、按钮等。比如:

在此处输入图像描述

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

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 时,它会从其他行返回按钮。

据我了解,xpath 通过这个lamba 查找说,“从elmt 开始,查找嵌套在elmt中的包含给定文本的按钮”。但是,由于我从其他行中获取未嵌套在当前行中的东西,所以我在这里缺少什么?

我的 xpath 有什么问题?

4

1 回答 1

1

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

//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 表达式的,我无法评论其余部分。)

于 2015-04-17T18:49:27.490 回答