我厌倦了从我的网页源手动查找网页元素的定位器(id,xpath,css,linkText等..)。它也消耗更多的努力。因此,为了避免这种情况,我想编写一个直接与页面源交互并生成定位器详细信息的代码(例如id =“xyz”,xpath =“html / body / table / tr / td / a”等) 为了实现这一点,我想我可以通过使用String对象的split()函数生成ID定位器。但是,我不知道如何为所有页面组件生成xpaths,css和linkText定位器? 任何人都可以帮我这个吗?
答案 0 :(得分:1)
虽然我一般建议你自己构建XPath表达式(因为你可以更好地利用类似属性的东西),可能是最合理和方便的自动方式来确定XPath表达式对于selenium来说,使用Firebug或Chrome Developer Tool的“Find XPath”功能。它们至少都使用@id
属性来缩短XPath表达式。
如果您想自己编写一些代码,例如。要嵌入您使用的其他工具中,您可能需要查看解决PHP问题的“PHP XML - Find out the path to a known value”的答案,或者另外一个解答Javascript答案的答案:“Javascript get XPath of a node”。< / p>
如果您使用的是任何不使用DOM的工具(Selenium / Firebug / Chrome Dev'工具/ JavaScript都可以),请注意我在“Why does my XPath query (scraping HTML tables) only work in Firebug, but not the application I'm developing?”中描述的问题。
答案 1 :(得分:1)
(目前)没有&#34;工具&#34;这甚至可以很好地合成可靠和简洁的基于xpath或css的定位器。我几乎在整个行业期间一直在编写硒和HTML / CSS代码,并且所谓的CASE方法声称比人类更好地完成这项工作会产生可笑的缺陷输出,因为它会产生有用的材料。但是,我想补充一点:有希望。
通过仔细查看各种XPath和CSS方法(参见http://www.w3schools.com/xpath/xpath_axes.asp了解一些一般指导原则)并仅使用最小的定位器字符串,这些字符串将在Firebug,Selenium IDE和其他类似插件中通过,人们可以逐渐走向更好的方法。通常,应该(在可能的情况下)仅使用对象的属性列表中的一个组件,并避免使用动态定义的数量。最佳做法是鼓励选择课程,名称或ID,只要它们是“不可变的”#34;。
可变性是一个棘手的问题:只需将光标拖动到对象上或单击它就可以改变类或css特征。有时这可以通过仅使用&#34; fixed&#34;来克服。违规属性的一部分。例如,一个类最初可能是tabContent&#39;,但是当光标放在相应的对象上时,它可能会更改为tabContentMouseOver&#39;。你明白了。通过使用xpath定位器字符串// * [contains(@class,&#39; tabContent&#39;)],无论是否点击,突出显示甚至禁用,您都可以更好地击中所需对象。
下一个&#34;技巧&#34;我鼓励你考虑使用&#34;好友&#34;原理;现在,许多对象(特别是类似于按钮的对象)由一个没有动态属性的图像组成,div由管理其事件驱动行为的div包装。对于这种情况,您可能会发现// div [@eventproxy =&#39; tabObject&#39;] / following :: img [contains(@src,&#39; tabImage&#39;)和text()=&# 39;内容&#39;]或类似内容将涵盖所有基础。内容会因您的具体情况而异。
大力使用分层轴方法(&#39;以下&#39;是我经常使用的方法),但仅在必要时使用;有时&#39; //&#39;就足够了。
惩罚自己的每一个不必要的角色,并奖励自己的方法,简洁,可以经常和严重的代码变化。最重要的是,坚持不懈。
一般来说,我避免使用&#34; pure&#34; CSS定位器由于以下原因 - 它们从未被用作定位器。 &#34;级联样式表&#34;它们本质上旨在影响可能的最大Web对象数量,并且很少是任何一个内容的唯一。网络编码人员因为在飞行中改变它们以产生漂亮的新效果或重组内容以满足客户需求而臭名昭着;为什么要将测试与已知波动的内容联系起来?此外,如果你愿意的话,CSS可以做的一切(我的意思是一切)也可以在XPath中完成。
关于XPaths的can being&#34;更慢&#34;比起CSS方法,我认为经常被证明它应该用几汤匙盐来服用。尽管如此,如果你对CSS技术感觉更舒服,那就去吧!经验将比你在stackoverflow中发现的任何模糊更好地教育你。