Selenium - 遍历DOM树
我正在用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 个回答
是的,正如其他回答提到的,你可以使用xpath。不过,从当前节点开始向上遍历DOM通常会更简单。
'./parent::*/parent::*/parent::*/parent::*'
开头的点和斜杠./
表示从当前节点开始。所以上面的代码是向上遍历DOM四层。
通过使用 xpath:
//button[text()="Big"/parent::*
它会从按钮 "Big" 向上走一级。
如果想要向上走两级,可以使用:
//button[text()="Big"/parent::*/parent::*
然后你可以写一个循环,把 /parent::*
加到 xpath 里,然后尝试点击,直到不再出现错误为止,这样就可以退出循环了。