Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片

一、验证码的处理方式
1.通过第三方图片识别文字的工具,但是准确率比较低
2.通过第三方网站识别验证码,准确率很高,几乎100%,但是收费
3.开发设置一个万能验证码提供测试用
4.在测试环境中屏蔽掉验证码
5.读取cookie和缓存
6.在输入验证码前加一个固定的时间等待,在这段时间手动输入验证码
接下来重点介绍一下万能验证码方法:
1.先知道如何查看系统是否有万能验证码
明确开发人员写的源代码位置 D:\phpfind\WWW\appliaction
要看懂开发人员的代码,必须了解MVC设计模式
即 M model 模型层,主要用于和数据库打交道的 user类对应user表
V view ,视图层,主要和前端界面打交道,用于收集和显示用户数据的
C controller 控制器,主要用于处理业务逻辑,判断验证码是否正确属于业务逻辑层
controller 层负责系统所有的业务逻辑,name如何找到后台登录的登录功能源代码?分析网址
http://127.0.0.1/index.php?m=admin&c=public&a=login
协议 ip地址 路径 参数 端口号
http协议默认端口号80,在网址中可以省略
https协议默认端口号是443

参数中 m是一个模块的意思,一个模块就是一个文件 夹,c 就是controller的意思,一个控制器就是一个类,一个文件夹,a就是action的意思,一个action就是一个代码中的一个方法
m=admin&c=public&a=login,所以这的意思就是有一个admin的模块,在admin的文件夹下有一个public类,public文件下有一个login方法
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
从这段代码中可以知道万能验证码为 1234

二、iframe的处理 当元素属性明明存在,但定位不到,怎么解决
什么是iframe,如何检查是否是iframe
1.iframe是网页里面嵌套的一个网页,此时直接去定位子页面里的元素是无法定位到的,如图
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
所以处理方法如下,
先切换到当前子页面中
driver.switch_to.frame(“mainFrame”)
然后再去定位子页面中的元素

三、元素的高级操作 ActionChains中封装了所有可以对页面元素进行的高级操作
1.ActionChains(driver)
Action 是动作的意思
Chain 是链表的意思
driver 代表了当前的浏览器
合起来就是,把当前浏览器转换成一个可以执行各种操作的行为链
双击操作如下:
ActionChains(driver).double_click(driver.find_element_by_id(‘7’)).perform()

四、动态页面处理方式之一
1.css selector copy方法 右键检查元素,选择copy,再选择copy selector
2.css selector 手动书写方法,标签名可以直接在css selector中使用,在css中需要在class属性前面加一个小数点;
在css中,需要在id属性前加一个井号
大于号>表示父子关系
空格表示祖先元素和子孙元素的关系

如图是动态id,无法用id进行定位
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
用上面的id,用css selector 方式进行定位,语句如下
driver.find_elenment_by_css_class_selector(’#filePicker’).click()
“#”上面解释了,id属性前加井号,固定格式
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
五、从本地系统上传图片的处理方式
1.把上传图片按钮的class样式去掉 删除(此删除操作只是为了帮助找到真正的上传图片控件)
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
此时,按变成输入框了 <input type=“file”…>标签才是真正上传图片的控件
Python-selenium web自动化 验证码、iframe 、双击操作、动态id、上传图片
2.上传图片
定位到上传图片控件后,直接对这个控件金属send_keys发送图片的路径即可
driver.find_element_by_name(“file”).send_keys(“D:/ds.jpg”) #tips:1.此处要的输入值路径里面要用正斜杠 2.图片一定要带后缀