一、八大定位方式
1. 总结
编号 | 定位方式 | 定位格式 | 方法举例 | 备注 |
---|
1 | by_id | id属性 | driver.find_element_by_id(‘cart_num’) | id在web端是唯一的 |
2 | by_name | name属性 | driver.find_element_by_name(‘key’) | name基本上是唯一的,但也可能不唯一 |
3 | by_class_name | class属性 | driver.find_element_by_class_name(‘but1’) | 复合类(class属性中间有空格)一般不建议通过class属性来定位,会报错。 |
4 | by_xpath | 绝对路径 | driver.find_element_by_xpath(’/html/body/div/div/div/div/form/input[1]’) | 以/开始,从html开始,xpath的下标从1开始 |
4 | by_xpath | 相对路径 | driver.find_element_by_xpath("//div[@class=‘schbox’]/form/input[1]") | 以//开始,从带有特殊属性(id/name/class)的父级开始 |
5 | by_css_selector | 绝对路径 | driver.find_element_by_css_selector(‘html>body>div:nth-child(6)>div:nth-child(2)>div>div>a>img’) | 以>分隔,不建议使用css的绝对路径查找,语法比较复杂 |
5 | by_css_selector | 相对路径 | driver.find_element_by_css_selector(‘input[name=‘srchtxt’]’) | 控件类型[属性名=’属性内容’] |
6 | by_link_text | 链接 | driver.find_element_by_link_text(‘免费注册’) | a标签,href属性对应了一个链接地址,即在页面点击后可以跳转的文字,都可通过link_text定位,传入的属性是页面可见的文字 |
7 | by_partial_link_text | 部分链接 | driver.find_element_by_partial_link_text(‘训练班学习大纲’) | 传入部分文字,部分文字需要唯一且连续 |
8 | by_tag_name | 控件标签类型 | driver.find_element_by_tag_name(‘input’) | 一般不使用tag_name定位,因为结果不精确 |
2. by xpath的其他用法
编号 | 情况分类 | 举例说明 | 备注 |
---|
1 | 属性唯一 | //input[@class=‘but1’] | 直接@属性 |
2 | 属性不唯一 | //input[@type=‘text’ and @class=‘but1’ and @name=‘key’] | 可以加and |
3 | 不写标签名称 | //*[@class=‘but1’] | 用*代替,*是一个正则匹配,不论标签类型是什么,只要满足后面的限制条件即可 |
4 | contains关键字 | //input[contains(@placeholder,‘请输入你’)] | 表示要查找placeholder属性包含“请输入你”的控件,包含内容需要是连续的 |
3. by css的其他用法
编号 | 情况分类 | 格式 | 举例说明 | 备注 |
---|
1 | 单属性定位 | 控件类型[属性=‘属性值’] | input[placeholder=‘请输入你要查找的关键字’] | - |
2 | 多个属性定位 | 控件类型[属性1=‘属性值1’][属性2=‘属性值2’] | input[name=‘key’][class=‘but1’] | - |
3 | 定位的控件有class属性 | 控件类型.class属性值 | input.but1 | - |
4 | 定位的控件有id属性 | 控件类型#id属性值 | i#cart_num | - |
5 | 顺数第一个-写法1 | 控件类型:nth-child(1) | div[class=‘schbox’]>form>input:nth-child(1) | 数字可以变 |
6 | 顺数第一个-写法2 | 控件类型:first-child | form>input:first-child | 没有second的用法 |
7 | 倒数第一个-写法1 | 控件类型:nth-last-child(1) | form>input:nth-last-child(1) | - |
8 | 倒数第一个-写法2 | 控件类型:last-child | form>input:last-child | - |
二、特殊API
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d23d9417cd910b816e91a671f4bd44cc.png)
三、unittest框架
1.大框架
编号 | 文件夹 | 作用 |
---|
1 | case | 存放测试用例,可分为web和app两个大类 |
2 | public | 存放公共业务封装的类和方法,比如登录模块 |
3 | report | 存放测试报告 |
4 | testrunner | 批量运行,运行后自动生成HTML报告 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/830457d7a4c6262e0918a8e3bc9febf5.png)
2. TestCase内容
编号 | 方法 | 作用 |
---|
1 | setUp | 初始化,一般包含初始化driver、打开项目地址、窗口最大化、打印开始时间 |
2 | test方法 | 函数名必须以test开头,具体业务实现,每一条自动化用例都要有一个断言结果 |
3 | tearDown | 清理/释放,包含截图、打印结束时间、退出浏览器 |
Unittest框架执行顺序:setUp->test->tearDown
3. 断言方式
编号 | 断言方式 | 关键字 | 举例 | 说明 |
---|
1 | 相等 | assertEqual | self.assertEqual(“退出”, regisText.text) | 相等则通过,不等则失败,逗号前后顺序可调换 |
2 | 不相等 | assertNotEqual | self.assertNotEqual(“退出”, regisText.text) | 不等则通过,相等则失败 |
3 | 包含 | assertIn | self.assertIn(“云商系统商城”,firstPageNavi.text) | 断言逗号后是否包含逗号前的内容 |
4 | 不包含 | assertNotIn | self.assertNotIn(“云商系统商城”,firstPageNavi.text) | - |
5 | 存在 | assertTrue | self.assertTrue(self.driver.find_element_by_xpath("//div[@class=‘top’]/span") .is_displayed()) | 返回true,则通过,返回false,则失败 |
6 | 不存在 | assertFalse | self.assertFalse(firstPageNavi.is_displayed()) | 判断不存在 |
四、unittest框架总结
- 测试类必须继承unittest.TestCase
- 测试函数必须以test开头
- 测试类必须有unittest.main()方法