Selenium - 遍历DOM树

4 投票
2 回答
4100 浏览
提问于 2025-04-17 00:21

我正在用Python和unittest以及Selenium RC开发一个大型网页应用(加载量达到4MB)。

我一开始的代码大概是这样的:

xp = '//div[id="kahoona"]//button[text()="Big"]'
selenium.click(xp)

这段代码在一切正常的时候没问题,但有时候我们的开发人员会对一些东西进行调整,比如把JavaScript事件处理程序移动到上面8层的某个父元素上。到那时,Selenium的点击操作就会出错。

他们还会随机插入或删除层级,所以今天的8层可能明天变成6层,后天又变成9层。

这就让我很头疼,因为我得去解读extjs生成的复杂结构,然后一次一个层级地往上移动——每次都要写一个新的xpath,再运行测试,直到错误消失。

我想要做的是,给定一些HTML,今天可能看起来像这样——只有端点是确定的(有些元素会有id或类名,有些则没有):

'//div[id="kahoona"]//div//table//tr//td//div//div//div//button[text()="Big"]'

我需要找到一种方法,从按钮开始,利用Selenium,向上遍历DOM树(这个结构是未知的,并且因为之前提到的调整而变化),直到找到外层的包装元素,并尝试像这样在每个层级上执行selenium.click(当前的xpath),直到不再出错。到那时,我应该能找到一个有效的xpath。

如果能相对高效地做到这一点,我就可以编写适应性测试,来应对这些不断的调整。开发人员会按照自己的方式进行开发——我没有影响力,也无法访问源代码。

任何建议都非常欢迎。

2 个回答

2

是的,正如其他回答提到的,你可以使用xpath。不过,从当前节点开始向上遍历DOM通常会更简单。

'./parent::*/parent::*/parent::*/parent::*'

开头的点和斜杠./表示从当前节点开始。所以上面的代码是向上遍历DOM四层。

7

通过使用 xpath:

//button[text()="Big"/parent::*

它会从按钮 "Big" 向上走一级。

如果想要向上走两级,可以使用:

//button[text()="Big"/parent::*/parent::*

然后你可以写一个循环,把 /parent::* 加到 xpath 里,然后尝试点击,直到不再出现错误为止,这样就可以退出循环了。

撰写回答