最后
路径代码
下面的代码会查找id
等于kw
的元素:
//\*[@id="kw"]
3. Xpath代码解释
1. //
和/
的区别和含义:
//
代表会在所有节点去进行查找,如果要指定层级或逐层查找的话可以使用/
。
举个例子:
下面的xml代码含义:一个班级下有两个学生【曲鸟 男】、【张三 女】:
<class>
<student>
<name>曲鸟</name>
<gender>男</gender>
</student>
<student>
<name>张三</name>
<gender>女</gender>
</student>
</class>
1)现在我们想获取第一个学生的信息可以这样写:
/class/student[1]
输出结果
<name>曲鸟</name>
<gender>男</gender>
2)想获取第一个学生的名称可以这样写:
/class/student[1]/name
输出结果
曲鸟
上面的代码是一层一层(class->student->name),那是否可以不指定层级,直接查找名称呢?
3)通过//
获取学生名称:
/class/name
甚至还可以这样写
//name
输出结果
张三
虽然获取到姓名了,但变成张三了,如果你通过//name[1]
的方式来获取的话,会发现执行失效!
所以,//
是不能够指定下标的,如果想获取曲鸟
的话可以通过校验文本的方式来匹配:
//name[text()="曲鸟"]
Xpath在线练习地址:https://www.bejson.com/testtools/xpath/
2. *
的含义
*
代表匹配任何元素节点,通过分析下图百度搜索框的源码发现它的标签为input
,那么我们将代码改为这样//input[@id="kw"]
也是可行的。
3. []
的含义
[]
中用于放置具体的匹配规则,之前代码中的[@id="kw"]
代表匹配id
等于kw
的元素;分析上图红框标签的属性会发现,如果替换为[@name="wd"]
也是能够匹配成功的;还可以改写为[@class="s_ipt"]
;
4. Xpath的模糊匹配和条件匹配
Xpath中=
用于全匹配,那它支持模糊匹配吗?
答案是支持的,Xpath中=
必须一模一样才算匹配成功。Xpath也可以通过contains
进行模糊匹配,之前代码中的[@id="kw"]
可以改写为[contains(@id, "k")]
这样也能够匹配成功。它的含义为匹配id
名称包含k
的元素。
如果有两个id
都包含k
那不是就匹配失败了吗?
是的,这个时候就可以使用Xpath的条件判断,例如有两个元素,他们的id
分别为:kw1
、kw2
。我们想通过模糊匹配来匹配kw1
的话,可以这样写[contains(@id,"k") and contains(@id,"1")]
,代码含义为匹配id
名称既包含k
又包含1
的元素。
Xpath支持的条件【and、or、not、contains、starts-with、string(.)】:
//input[@type="text" and @name="wd"]
//input[@type="text" or @name="wd"]
//input[@type="text" and not(contains(@name,'wd'))]
//input[starts-with(@text,"te")]
//input[ends-with(@text,"te")]
//input[contains(@name, "wd")]
Xpath可以通过显示的文本进行匹配吗?
可以的,下面是百度页右上角【新闻】标签的源码
通过文本匹配的话,代码可以这样写 (类似于八大定位方式中的By.LINK_TEXT
):
//\*[text()="新闻"]
通过闻
字模糊匹配的话可以这样写 (类似于八大定位方式中的By.PARTIAL_LINK_TEXT
):
//\*[contains(text(),"闻")]
四、总结
Xpath的功能还有很多,但对于自动化来讲掌握上述这几种常用方法已经足够了!万一还不够用,我们还可以通过airtest
【图像识别】的定位方法来解决。
可以阅读 重复元素如何定位区分?Selenium的缺点让图像识别来弥补 这篇文章进行了解。后续也会在该专栏的实战篇中进行详细图像识别定位的教学,欢迎订阅本专栏!
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)**
[外链图片转存中…(img-k9qIGIP7-1715548431204)]