我在python中使用unittest和Selenium RC在怪物网络应用程序(4兆负载)上工作。
我从
开始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(the_current_xpath)at每个级别,直到 它不再失败。那时,我应该有一个有效的xpath。
如果可以相对有效地完成这项工作,我可以编写适应性测试,以解决无休止的修补工作。开发人员做他们自己的事情 - 我没有影响力,也无法访问资源。
非常欢迎任何建议。
答案 0 :(得分:6)
使用xpath:
//button[text()="Big"/parent::*
它将从“Big”按钮向上走1级。
要走2级,请使用:
//button[text()="Big"/parent::*/parent::*
然后你可以编写一个循环来将/parent::*
添加到xpath然后尝试单击,直到它不抛出异常然后退出循环。
答案 1 :(得分:1)
是的,如其他答案所述,您可以使用xpath。但是当走上dom时,从当前节点开始往往更容易。
'./parent::*/parent::*/parent::*/parent::*'
开头的点和斜杠./
从当前节点开始。所以上面的代码将DOM分为4级。