目的:回归测试、大数据量测试、降低成本,提高效率。
条件:需求稳定、手工测试通过、周期较长、脚本复用、重复性工作多。
一、环境搭建
安装Python-->安装Selenium-->安装Chrome(IE关闭安全4个保护模式)-->安装WebDriver(…\Python\Python36)-->安装PyCharm-->解压phpfind.zip到D盘
二、元素定位
1、id---元素有id属性
2、name---元素有name属性
3、class_name---元素有class属性
4、css_selector---右键Copy selector
css定位方式:
1)两节点组合
a.目标节点
b1.有id属性
b2.有定位自身的祖先节点:唯一name属性/唯一class属性
2)增加新节点
css层叠样式:
a.“#”表示后面接的是id
b.“.”表示后面接的是class
c.前面没有符号表示标签名:a、div、span、input
d.name等其他属性的表示:[name="username"]
e.“>”的前面表示父元素
f.“>”的后面表示子元素
g.:nth-child(n)表示父元素的第n子元素
h.先写目标元素,再写一级一级的父元素
i.逐级删减至一两个,目标元素不能删减
5、link_text---标签对之间文本,必须是a标签
6、xpath---右键Copy XPath
7、tag_name---元素标签名,同标签名很多,不推荐
8、partial_link_text---标签对之间部分文本,必须是a标签
三、综合操作
1、click与submit
2、time.sleep与implicitly_wait
3、切换window与frame
4.1、find_element_by_*()选择一个页面元素,直接操作,不能用下标
4.2、find_elements_by_*()选择一组页面元素,不能直接操作,用下标
5、下拉框Select(driver.find_element_by_*()).select_by_index/value/visible_text()
6、复选框find_elements(By.NAME,'sex')[1]
find_element(By.XPATH,'//input[@value="1"]')
7、弹出框switch_to.alert.accept/dismiss
8、文件上传
1)上传文件控件<input type="file"
2)隐藏属性元素
a.style属性,display:none block,visibility:hidden visible
b.class属性,在元素标签中,通过class属性名字在css层叠样式表中找到class实现
9、日期readonly
10、html
a. input标签名,表示输入。type="text"文本输入框,type="submit"提交按钮
b. ul无序的列表un-order list
c. li列表中的一项list item
d. form表单,提交用户输入到服务器
四、设计模式
1、pageobject类
1)把一个网页的页面看做是类的一个对象
2)每个网页创建一个类,描述页面所有可执行操作
a.方法,可执行操作
b.属性:网址、元素
2.1、元素定位和操作封装到pageobject类中,网页变更,只修改pageobject类
2.2、测试用例和步骤封装到testcase类中,步骤变更,只修改testcase类
3、测试类继承unittest,对pageobject内部方法做单元测试
4.1、测试用例可以为每一行代码做注释,便于后期维护代码
4.2、可以看成是自己写的一个代码库,类似于selenium
五、测试框架
由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合。基础功能测试框架Selenium、管理执行框架Phoenix Framework。
1、类和对象,类是抽象的概念,对象是具体的事物,把具有相同特点的事物称为类。一般方法不能直接通过类来执行,先把类实例化,生成一个具体的对象才能执行方法。
2、类和方法,属性用来描述类的性质或特征,以名词为主self.driver;方法用来描述类的行为或动作,以动词为主login。
3、继承,类和类,父类声明的属性和方法,子类默认都具有,Object是所有类的父类。
class DanYuanTest(unittest.TestCase)
4、多态,动物猫叫喵狗叫汪
1)要有继承
2)父类引用指向子类对象
3)方法的重写
5、实现父类未实现的方法
1)def setUp(self): 执行测试用例之前的操作 driver=webdriver.Chrome()
2)def tearDown(self): 测试用例执行之后的操作 driver.quit()
6、写具体测试用例的方法,方法名必须以test开头
7、运行所有的测试用例,创建一个单独python文件,
if __name__ == "__main__":
unittest.TextTestRunner().run(unittest.defaultTestLoader.discover("./","dan_yuan*.py"))
8.1、成员变量,类内部有效,前面加self.
8.2、局部变量,在方法内部有效,在结构体内部有效,例如for循环声明i循环内部有效
9、优势
1)组织和执行测试用例
a. 一次性执行当前文件的所有测试用例unittest.main()
b. 一次性执行所有匹配的测试用例
b1. 找到匹配的测试用例
suite=unittest.defaultTestLoader.discover('./',pattern='test*.py')
b2. 执行一组测试用例unittest.TextTestRunner().run(suite)
2)丰富的日志和断言
共运行几条用例,花费时间,运行状态:pass测试通过、fail提交缺陷、error修改程序
self.assertIn()、self.assertEqual()
10、改进,所有测试用例类,都有setUp(),tearDown(),封装到中间类