## xpath
1、为什么要用它
2、实战当中采取什么样的策略去编写 xpath 表达式
3、xpath 基础语法
- 绝对路径, 相对路径
- 标签
- 属性
- text 文本
- 函数
- 索引
- 元素之间的关系
- 父子
- 祖先和子孙后代
- 同辈
- 轴运算
## 1、为什么要用它
- 没有 id, name 属性
- 通过 class , tagname 找到的不是唯一的
- link text 只能去定位 a
xpath 为什么功能强:
可以组合多个条件,标签名,属性,text, 元素之间的关系
### 绝对路径和相对路径
// 相对路径
/ 绝对路径(不用)
## 相对路径
//*[@id="kw"]
* 是表示任意的标签名称 //input[@id="kw"]
完整xpath的基本语法:
```
//标签名[@属性名="属性值"]
```
xpath 验证:
在源码页面按 ctrl + f 会出现 xpath 输入框
后面能看到你的表达式具体能够得到多少个元素。
## 实战当中采取什么样的策略去编写 xpath 表达式
- 1、通过浏览器的右击,复制xpath 表达式
- 2、第三方工具chropath
## xpath 详细语法
//input[@id="kw"]
文本: //a[text()='抢投标'] ==>
套路 包含某个文本 contains //a[contains(text(), '强投标')]
//a[contains(@id, 'kw')]
属性或text组合 //a[text()='抢投标' and @id="kw" and @name='wd']
xpath 索引是从1开头: (//input[@id and @name])[1]
通过祖先找子孙: //form[@id='form']//input[@name='wd']
通过父亲找儿子: //form[@id='form']/input[@name='wd']
通过儿子找父亲: //sub/..
通过儿子找祖父: //sub/../..
轴运算:
找找哥哥姐姐: //input[@name='wd']/preceding-sibling::span
找找弟弟妹妹: //input[@name='wd']/following-sibling::span
找祖先: //input[@name='wd']/ancestor::span
- 绝对路径, 相对路径
- 标签
- 属性
- text 文本
- 函数
- 索引
- 元素之间的关系
- 父子
- 祖先和子孙后代
- 同辈
- 轴运算
## 总结xpath
1、 浏览器右击复制、chropath 第三方库
2、 检查xpath好的xpath: 层级比较少 1-2
3、 xpath 找到元素验证:ctrl + f
4、 //input[@id='kw'] 基本
5、 //input[@id='kw' and @name='wd'] and
6、 //input[@id='kw' and text()='wd'] text
7、 //input[contains(text(), '')] contains
8、 (//*[contains(text(), '')])[1] 索引
9、 //form//input[] 通过祖先找子孙
## 找元素常见错误
selenium.common.exceptions.NoSuchElementException
## 等待的第一种方法
- 强制等待, time.sleep(3)
- 隐性等待, 智能等待元素被加载, 全局只需要设置一次, 只能等待元素被加载
- 显性等待,非全局
- 真的很麻烦,不容易理解。
- 你可以自己设置某种条件,如果条件满足了,就返回;如果条件不满足,就继续执行
- 等待某个元素可以被点击
- 或者某个元素可见
- 等待某个url=''
隐式等待的写法:
## 显性等待, 页面切换。
## 浏览器操作