架构层面
pthon调用selenium的方法向驱动发送请求,驱动转换成js代码发送给浏览器,浏览器执行代码,进行操作
python(任何编程语言) ---发送http请求--> chromedriver.exe ---js代码--> 浏览器
源码层面
初始化浏览器Chrome():
-通过Popen(驱动路径)方法,自动运行命令行,启动chromedriver.exe本地服务
-通过远程连接RemoteConection 初始化很多接口地址和请求方法
python每次调用selenium的方法,都会调用excute方法,最终调用request方法,向chrmedriver发送一次请求访问相应的接口,然后驱动转化称为js代码发送给浏览器
cookis保存
当我们登录页面之后,服务器会发送一个token给客户端,下次访问登录后的页面的时候会自动带上,就不会再进行登录
在web自动化测试中,因为selenium每次启动浏览器都是无痕模式,不会自动保存cookie,有时候登录需要验证码,而我们手上没有万能验证码的时候,就需要使用cookie来保存登录状态
操作步骤:
1,首先手动登录页面,得到token
2,用selenium的方法传入token值
这里传入的参数是一个字典,格式为{"name": "token名称","value": "token值"}
关键字驱动
数据驱动:很多测试数据,共享一个测试逻辑(代码)
关键字驱动:很多测试数据,测试步骤,测试逻辑不一样
web自动化关键字驱动的数据包含:需要调用的方法,调用方法所需要的参数
yaml文件里的横杠-表示文件类型是一个列表数据,而每个列表的元素是字典数据,表示整个操作流程需要的步骤.代替了po模式里的页面操作.对于不同的页面对能使用
yaml文件中,不支持元组类型,但是yaml里的列表符号[],结合了Python中的列表和元组的功能
深坑注意:使用locator传参的时候,传入的是元组或者列表,可以使用
但是读取yaml文件之后,locator对应的值
会变成
把列表里面没有引号的内容加上引号,导致传参出错,所以在yaml文件中,元素定位的方式要统一写成带引号的
action: 浏览器需要调用的方法,该方法存在basepage中
params: 方法需要的参数,包含参数名称和所对应的值
注意:action里的函数名和params里的参数名要跟方法需要的函数名和参数名一致
具体操作步骤:
1,读取yaml文件的内容.包括浏览器操作的方法和对应的参数
#读取yaml文件
with open(r"E:lemonban-seleniumlessonlesson44_关键字驱动test_datalogin_steps.yaml",encoding="utf-8")as f:
steps = yaml.safe_load(f)#得到的结果是列表嵌套字典
读取的结果是一个列表嵌套字典,而字典里也有字典
2,得到basepage的页面对象,这里不用po页面对象,因为basepage页面的方法更加通用
3,使用for循环获取每一步的步骤
#遍历列表,获取数据,得到每一步的测试步骤
for step in steps:
#从yaml数据中获得需要调用的方法的名称
method_name = step["action"]
#获取方法所需的参数
method_params = step["params"]
#通过page对象,获取basepage类里的方法的名称
method = getattr(page,method_name)
#使用方法,传入参数,传参时候解包字典,相当于传入locator = "",word=""等关键字参数
method(**method_params)
引申:getattr可以获取对象的属性和所在的类里的方法,得到的是方法的名称,并没有调用,要想调用直接在方法名称后面加()
总结
关键字驱动适合用于跑正常流程的功能,如果有多个用例,则需要使用多个yaml文件来保存不同的操作步骤,并且写多个测试用例函数
而数据驱动+po模式则适合逻辑相同,输入数据不同(在登录页面输入不同数据,查看错误信息)的异常用例



