# selenium定位方式
* [Xpath定位](http://brtc.imsam.cn/1377978#Xpath_41)
* [CSS定位](http://brtc.imsam.cn/1377978#CSS_93)
在进行web自动化之前,需要先来了解一下web页面的基本内容。
比如,如下是一张百度首页
![](https://img.kancloud.cn/6f/61/6f61b72faa96d04e90e9b36b1e47c725_1051x445.png)
那如果我们需要对百度页面进行操作,那么我们就需要知道他的html代码了。
我们可以鼠标选中需要操作的元素,`鼠标右键,检查`
![](https://img.kancloud.cn/a1/65/a16560ef0afcb217a26894bacd3fdb19_908x506.png)
这一行代码就是百度输入框的代码了
![](https://img.kancloud.cn/5e/16/5e164213274dd5f2382d5f60ea463b93_1171x671.png)
来看看这行代码
~~~
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
~~~
首先第一个,这个是一个html代码,那html代码中 这个代码我们称之为input标签
那在这个input标签中,有很多的属性,其中`=`左边的是属性名称,`=`右边的是属性值
所以这个html标签有id、name、class、value、maxlength等等属性
第二个,HTML标签有自己的层级关系
如图,span标签就是input标签的父标签
![](https://img.kancloud.cn/e3/d6/e3d6f385065d0a3be464280b742cbd12_1214x325.png)
| 定位方式 | 定位表达式 |
| --- | --- |
| 根据id来定位 | d.find\_element\_by\_id('id的值') |
| 根据name来定位 | d.find\_element\_by\_name('name的值') |
| 根据class来定位 | d.find\_element\_by\_class\_name('class的值') |
| 根据标签名定位 | d.find\_element\_by\_tag\_name('标签名') |
| 根据文本链接定位 | d.find\_element\_by\_link\_text('完整的文本链接') |
| 根据部分文本链接定位 | d.find\_element\_by\_partial\_link\_text('部分的文本链接') |
| 根据css选择器定位 | d.find\_element\_by\_css\_selector('css表达式') |
| 根据xpath定位 | d.find\_element\_by\_xpath('xpath表达式') |
> ### Xpath定位
* 根据绝对路径定位
~~~
/html/body/div/form/p/label/input
/html/body/div/form/p[2]/label/input
~~~
* 路径与属性的结合
`//标签名[@属性名="属性值"]`
比如说:想定位到 for="user\_pass" 的label标签
`//label[@for="user_pass"]`
* 如果想同时使用多个属性去定位
语法:
`//标签名[@属性名="属性值" and @属性名="属性值"]`
想定位到:class="input" id="user\_pass" 的 input标签
`//input[@class="input" and @id="user_pass"]`
比如:定位到 for="user\_pass" 的label标签 的 input子标签
`//label[@for="user_pass"]/input`
使用Xpath实现登录blog
~~~
from selenium import webdriver
from time import sleep
d = webdriver.Chrome()
d.get('http://os-201804081018/blog/wp-login.php')
d.maximize_window()
sleep(3)
d.find_element_by_xpath('//label[@for="user_login"]/input').send_keys('test')
sleep(1)
d.find_element_by_xpath('/html/body/div/form/p[2]/label/input').send_keys('test123')
sleep(1)
d.find_element_by_xpath('//input[@class="button button-primary button-large"]').submit()
sleep(1)
d.close()
d.quit()
~~~
> ### CSS定位
* css中用空格 表示下级标签(可以是子标签,也可是孙子级别标签)
* 路径与属性的结合
语法:
`标签名[属性名="属性值"]`
比如说:想定位到 for="user\_pass" 的label标签
`label[for="user_pass"]`
* 如果想同时使用多个属性去定位
语法:
标签名\[属性名="属性值"\]\[属性名="属性值"\]
想定位到:class="input" id="user\_pass" 的 input标签
`input[class="input"][id="user_pass"]`
比如:定位到 for="user\_pass" 的label标签 的 input子标签
`label[for="user_pass"] input`
* 只用属性
想定位到 for="user\_pass" 的标签
`[for="user_pass"]`
* 关于id与class定位
在css定位中,id或者class定位有快捷键定位方式
id用#表示,class用.表示
想定位到:id="user\_pass" 的 input标签
`input#user_pass`
想定位到:class="button-primary" 的input标签
`input.button-primary`
想定位到:class="button-primary" id="wp-submit" 的input标签
`input.button-primary#wp-submit`
使用css定位实现blog登录
~~~
from selenium import webdriver
from time import sleep
d = webdriver.Chrome()
d.get('http://os-201804081018/blog/wp-login.php')
d.maximize_window()
sleep(3)
d.find_element_by_css_selector('#user_login').send_keys('test')
sleep(3)
d.find_element_by_css_selector('input[type="password"]').send_keys('test123')
sleep(3)
d.find_element_by_css_selector('p.submit input#wp-submit').click()
sleep(3)
d.close()
d.quit()
~~~
- 总章
- Oracle数据库
- 常见的Linux命令
- 理论内容整理
- 给你如下功能怎么测试
- 支付怎么测试
- 购物车怎么测试?
- 搜索功能怎么测试?
- 文件上传功能怎么测试?
- 登录功能怎么测试?
- 还款功能怎么测试?
- 订单功能怎么测试?
- 自动化测试篇
- 必记代码
- 接口测试篇
- 性能测试篇
- app测试篇
- 面试篇
- 项目篇
- 职业素养篇
- 真实案列分析
- 如何预防冷场
- redis
- 琪琪
- 禅道搭建手册
- 禅道搭建手册1
- 禅道的基本使用
- 基于Python3_Selenium的自动化
- Python3安装
- Python3基础
- 列表_元组_集合
- 函数_模块_类
- Python代码
- selenium环境
- selenium定位方式
- Selenium常见操作
- toast读取代码
- 添加用户代码
- 隐式等待与显式等待
- 循环添加用户
- 测试用例练习
- 测试用例优化
- Fiddler抓包工具
- 安装
- Fiddler使用
- 接口测试
- Jmeter的安装
- Jmeter使用
- jmeter+ant+jenkins接口自动化测试框架
- 接口安全测试
- 性能测试
- Nmon监控LInux系统
- Jmeter分布式
- 性能测试-具体案例
- Monkey
- 安装1
- Monkey使用
- appium自动化
- appium的安装
- appium基本使用
- 真机USB连接
- 问题排查
- Jenkins持续集成
- Jenkins安装
- Jenkins配置任务
- Python扩展内容
- Python连接数据库
- Python进行接口测试
- 开启服务