技术心得:xpath、CSS定位方法

简介: 技术心得:xpath、CSS定位方法

Xpath常用的定位方法


相信做过selenium UI自动化的朋友都知道,工作中大部分的元素定位都是使用xpath进行定位,所以xpath是UI自动化工作中非常重要的一个环节,所以我单独整理出来一篇博客出来~~希望对大家有帮助~


相对定位


相对定位是两个杠表示“//”,相对路径易维护


绝对路径


绝对定位用一个杠“/”, 绝对路径一个层级变化所有空间都有变化


/html/body/div【1】/section/section/main/div【2】/div【2】/div【1】/div【2】/button【1】/span


last()方法


当标签存在多个相同的时候,可以使用xpath中的last()方法,定位到最后一个


//标签名【last()】


//span/ul//li【last()】


如果我们要定位到倒数第二个,可以在last() 后面加上 -1,代表倒数第二个


//标签名【last()-1】


//span/ul//li【last()-1】


属性查找@


如,这里我们以百度为例,如果我们要定位到百度的id元素,那么可以使用 //标签名【@元素名称=‘元素值’】


//标签名【@元素名称='元素值'】


//input【@id='kw'】


xpath逻辑表达式-and


当一个元素无法定位到唯一值得时候,我们可以使用and表达式,同一个标签下定位多个元素


//标签名【@元素名称='元素值' and @元素名称='元素值'】


//input【@id='kw' and @class='s_ipt'】


xpath表达式-or


xpath 中 or的表达式和and很像,指的是当你元素满足其中一个条件的时候,就可以定位到,如图,在百度搜索框中,我们故意将@class='s_t’元素写错,内容中并没有这个元素,


// 标签名【@元素名称='元素值' or @元素名称='元素值'】


//input【@id='kw' or @class='s_t'】


非查找控件


如图,如果我们想要查找元素值不等于某个值的内容,可以使用!=方法,但是这个方法在工作中用的比较少,目前我还没有用到过,不过xapth提供了这个方法,可以结合场景使用~


//标签名称【@元素名称 != '元素值'】


//input【@class!='1111'】


Not查找


//标签名【not(.='元素值')


//year【not(.=2005)】


//div【not(@id="tab-AndroidVersions")】


这里没有找到合适的场景,意思就是查找year内容不为2005的内容 注:“.”就等于text()


模糊匹配


//标签名【contains(text(), "内容"】


//div【contains(text(), "更新")】


这里的意思是模糊查询内容包含“更新”的元素


精准匹配


//标签名【(text()='内容')】


//div【(text()='更新文案')】


使用大于小于符号定位


//div【@class="cell" and text()>'1336'】


//div【@class="cell" and text()[span class="hljs-string">'1336'】


如图,当我们商品列表中有多个商品ID,那我们想要定位到ID大于或者小于1336的数据,可以通过上面的方式。


轴方式定位


轴表达式说明


parent:: :表示当前节点的父节点元素


ancestor:: :表示当前节点的祖先节点元素


child:: :表示当前节点的子元素 /A/descendant:: 表示A的所有后代元素


self:: :表示当前节点的自身元素


ancestor-or-self:: :表示当前节点的及它的祖先节点元素


descendant-or-self:: :表示当前节点的及它们的后代元素


following-sibling:: :表示当前节点的后序所有兄弟节点元素


preceding-sibling:: :表示当前节点的前面所有兄弟节点元素


following:: :表示当前节点的后序所有元素


preceding:: :表示当前节点的所有元素


parent:: 当前节点的父节点元素


//代码参考: https://weibo.com/u/7932047597

//div【@class="cell" and text()='1338'】/parent::


如图,我们要定位到ID为1338元素的父节点元素,可以使用如上xpath轴定位, “” 表示匹配所有


following-sibling::


/bookstore/book【1】/following-sibling::


查找books1所有的同级元素都查找出来,“”表示所有


//div【3】/table/tbody/tr【1】/td【1】/following-sibling::td【2】


查找td【1】下同级节点下的第二个节点


3. following-sibling::当前节点的前面所有兄弟节点元素


/bookstore/book【2】/year/preceding-sibling::


意思是:查找books【2】下year前的同级节点


查找节点的父辈


/bookstore/book【2】/year/parent::


查找节点的子辈


/bookstore/book【2】/descendant::


使用position位置定位


意思是定位到th标签下的第一个


//th【@class="c-id " and position()=1】


也可以//th【@class="c-id " and position()<2】 这样用~


1、css属性定位


css选择器策略


示例


说明


#id


#telA


选择id="telA"的所有元素。


.class


.telA


选择 class="telA”的所有元素。


【属性名=属性值】


【name=telA】


除了id和class属性,其他属性的定位格式


【attribute】


【target】


选择带有target 属性所有元素。




选择所有元素。


2、css属性值模糊匹配定位


css选择器策略


示例


说明


【attribute^=value】


a【src^="https"】


选择其src 属性值以"https”开头的每个元素。


【attribute$=value】


a【src$=".pdf"】


选择其src属性以".pdf“结尾的所有元素。


【attribute=value】


a【src="abc"】


选择其src 属性中包含“abc"子串的每个元素。


【attribute~=value】


a【title~=flower】


定位标签属性title值中有独立flower词汇的节点


【attribute


=value】


a【lang


=en】


用于选取带有以指定值开头的属性值的元素。


注意:【attribute|=value】


该值必须是整个单词,比如 lang="en",或者后面跟着连字符,比如 lang="en-us"。


3、css标签定位


css选择器策略


示例


说明


element


p


定位所有


元素。


标签名【属性名=属性值】


input#telA


定位id属性值为telA的所有元素


4、css层级关系定位


css选择器策略


示例


说明


element,element


div,p


选择所有 元素和所有


元素。


element element


div p


选择 元素内部的所有


元素。包括子孙后代。


element>element


div>p


选择父元素为 元素的所有


元素。只包括子代。


element+element


div+p


选择紧接在 元素之后的所有


元素。同辈元素。


示例:


css选择器策略


示例


说明


需要使用 > 或 空格表示层级关系


语法


父标签名【父标签属性名=属性值】>子标签名


p#p1>input


定位id属性值为p1的元素


父标签名【父标签属性名=属性值】 子标签名


p#p1 input


同上


5、css索引定位


css选择器策略


示例


说明


:only-child


p:only-child


选择属于其父元素的唯一子元素的每个


元素。


:nth-child(n)


p:nth-child(2)


选择属于其父元素的第二个子元素的每个


元素。


:nth-last-child(n)


p:nth-last-child(2)


同上,从最后一个子元素开始计数。


:nth-of-type(n)


p:nth-of-type(2)


选择属于其父元素第二个


元素的每个


元素。


:nth-last-of-type(n)


p:nth-last-of-type(2)


同上,但是从最后一个子元素开始计数。


6、css逻辑运算定位


css选择器策略


逻辑定位


示例


标签名【属性名1=属性值1】【属性名2=属性值2】


示例


说明


同时匹配多个属性


7、css元素状态定位


选择器


例子


例子描述


:empty


p:empty


选择没有子元素的每个


元素(包括文本节点)。


:target


#news:target


选择当前活动的 #news 元素。


:enabled


input:enabled


选择每个启用的 元素。


:disabled


input:disabled


选择每个禁用的 元素


:checked


input:checked


选择每个被选中的 元素。


:not(selector)


:not(p)


选择非


元素的每个元素。


七 、总结


如果元素有明确id,name,class属性时,使用对应的基本定位方法。


如果没有id,name,class属性时,或id,name,class属性是动态/不唯一的时候,使用XPath和css_selector定位。


定位页面超链接使用link_text和partial_link_text定位


可使用XPath和css_selector定位的时候,优先使用css_selector。


css_selector定位的速度和效率比Xpath高。


没有最好的,只有最精简的,怎么简单怎么来。


扩展:为什么css_selector定位的速度和效率比Xpath高?


因为你无论用那种方式定位,最终都会转换到css_selector进行元素定位。


我们可以在PyCharm中,安装ctrl点击对应的方法,进行查看源码,最终都会定位到如下代码:


def find_element(self, by=By.ID, value=None):


"""


Find an element given a By strategy and locator. Prefer the find_elementby methods when


possible.


:Usage:


element = driver.find_element(By.ID, 'foo')


:rtype: WebElement


"""


if self.w3c:


if by == By.ID:


by = By.CSS_SELECTOR


value = '【id="%s"】' % value


elif by == By.TAG_NAME:


by = By.CSS_SELECTOR


elif by == By.CLASS_NAME:


by = By.CSS_SELECTOR


value = ".%s" % value


elif by == By.NAME:


by = By.CSS_SELECTOR


value = '【name="%s"】' % value


return self.execute(Command.FIND_ELEMENT, {


'using': by,


'value': value})【'value'】

相关文章
|
24天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
32 6
|
1月前
|
移动开发 前端开发 JavaScript
除了 CSS3,还有哪些技术可以实现动画效果?
除了 CSS3,还有哪些技术可以实现动画效果?
54 5
|
1月前
|
缓存 监控 前端开发
CSS 提高性能的方法
【10月更文挑战第24天】在实际应用中,还需要根据具体项目的特点和需求,灵活选择和组合这些方法,不断进行优化和改进。同时,随着技术的不断发展,也需要持续关注新的性能优化技巧和最佳实践,以保持在性能优化方面的领先地位。你对 CSS 性能优化还有哪些深入的思考和经验呢?欢迎进一步交流和分享。
|
1月前
|
前端开发
css页面顶部底部固定,中间自适应几种方法
【10月更文挑战第22天】css页面顶部底部固定,中间自适应几种方法
|
2月前
CSS_定位_网页布局总结_元素的显示与隐藏
CSS_定位_网页布局总结_元素的显示与隐藏
28 0
|
2月前
|
前端开发 开发者 UED
CSS不同技术的探讨
【10月更文挑战第11天】 CSS不同技术的探讨
|
2月前
|
存储 前端开发 JavaScript
CSS:现代Web设计的不同技术
【10月更文挑战第11天】 CSS:现代Web设计的不同技术
|
Web App开发 前端开发 iOS开发
|
24天前
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
49 7