Selenium 2:以编程方式查找Web元素定位符

我厌倦了从我的网页源手动查找网页元素的定位器(id,xpath,css,linkText等..)。 它也消耗更多的努力。 所以,为了避免我想编写一个直接与页面源交互并生成定位器详细信息的代码(例如id =“xyz”,xpath =“html / body / table / tr / td / a”等)来实现这一点,我想我可以通过使用String对象的split()函数生成ID定位器。 但是,我不知道如何为所有页面组件生成xpaths,css和linkText定位器? 任何人都可以帮我这个吗?

虽然我一般建议你自己构建XPath表达式(因为你可以更好地利用类似于类属性的东西),但是确定selenium的XPath表达式的最合理和方便的自动方法是使用Firebug或Chrome Developer工具的“查找XPath”function 。 它们至少都使用@id属性来缩短XPath表达式。


如果你想自己编写一些代码,例如。 为了嵌入你使用的其他工具,你可能想看一下“ PHP XML – 找出已知值的路径 ”的答案,它解决了PHP中的问题,或另一个解答了Javascript的答案:“ Javascript get节点的XPath “。

如果您正在使用任何不在DOM上工作的工具(Selenium / Firebug / Chrome Dev’工具/ JavaScript会这样做),请注意我在“ 为什么我的XPath查询(抓取HTML表格)仅适用于Firebug ”中描述的问题,但不是我正在开发的应用程序? “

目前(目前)还没有“工具”可以完成合成可靠和简洁的基于xpath或css的定位器的相当不错的工作。 我几乎在整个行业期间一直在编写selenium和HTML / CSS代码,并且所谓的CASE方法声称比人类更好地完成这项工作会产生可笑的缺陷输出,因为它会产生有用的材料。 但是,我想补充一点:有希望。

通过仔细查看各种XPath和CSS方法(请参阅http://www.w3schools.com/xpath/xpath_axes.asp以获取一些一般指导原则)并仅使用将在Firebug中通过集合的最小定位器字符串,Selenium IDE和其他类似的插件一样,人们可以逐步向更好的方向发展。 通常,应该(在可能的情况下)仅使用对象属性列表中的一个组件,并避免使用动态定义的数量。 最佳做法是鼓励选择类,名称或ID,只要它们是“不可变的”。

可变性是一个棘手的问题:只需将光标拖动到对象上或单击它就可以改变类或css特征。 有时这可以通过仅使用违规属性的“固定”部分来克服。 例如,一个类最初可能是’tabContent’,但是当光标放在相应的对象上时,它可能会更改为’tabContentMouseOver’。 你明白了。 通过使用xpath定位器字符串// * [contains(@ class,’tabContent’)],无论是否单击,突出显示甚至禁用,您都可以更好地击中所需对象。

我鼓励你考虑的下一个“技巧”是使用“伙伴”原则; 现在,许多对象(特别是类似于按钮的对象)由一个没有动态属性的图像组成,div由一个管理其事件驱动行为的div包装。 对于这种情况,您可能会发现// div [@ eventproxy =’tabObject’] / following :: img [contains(@ src,’tabImage’)和text()=’Contents’]或类似的内容将涵盖所有基础。 内容将根据您的具体情况而有所不同。

大力使用分层轴方法(’跟随’是我经常使用的方法),但只在必要时使用; 有时’//’就足够了。

惩罚自己的每一个不必要的角色,并奖励自己的方法,简洁,可以经常和严重的代码变化。 最重要的是,坚持不懈。

一般来说,我避免使用“纯”CSS定位器,原因如下 – 它们从未被用作定位器。 “级联样式表”本质上旨在影响可能的最大Web对象数,并且很少是任何一个内容所独有的。 网络编码人员因为在飞行中改变这些因素而产生漂亮的新效果或重组内容以满足客户需求而臭名昭着; 为什么要将测试与已知波动的内容联系起来? 此外,如果你愿意的话,CSS可以做的一切(我的意思是一切)也可以在XPath内部完成。

关于XPaths的can being比CSS方法“慢”,我认为已经经常被certificate它应该用几汤匙的盐来服用。 尽管如此,如果你对CSS技术感觉更舒服,那就去吧! 经验将比您在stackoverflow中发现的任何模糊更好地教育您。