Selenium知识笔记
目录
1 多个iframe切换
文章内容参考了官方文档:与iFrames和frames一起工作 | Selenium
python官网:Selenium Client Driver — Selenium 4.1.0 documentation
1.0 基础知识
iframe是HTML中的框架标签,也就是可以显示多个页面 (待补充)
1 | <iframe src="/i/eg_landscape.jpg"></iframe> # iframe标签 |
frame标签的类型有三种:frameset、frame、iframe
frameset和普通标签没有区别,不会影响定位;对Selenium来说frame和iframe的处理方法是一样的。
1 | <div id="modal"> |
这是部分HTML网页,我们希望定位到 iframe 框架内的按钮 button。
若我们直接采用元素定位是无法定位到的,selenium提供了三种定位方法。
其思路是先切换到iframe框架内,然后对其中某一元素进行操作,最后离开框架
1.1 切换frame
1 | driver.switch_to.frame(param) |
传入的参数param可以为iframe元素的:
id、name、index等属性
定位该iframe所返回的Selenium的WebElement对象
1 | driver.switch_to.frame(0) # index索引定位 |
1.1.1 使用WebElement方法
优点:灵活
1 | # 存储网页元素 |
使用元素定位找到iframe的位置
switch_to.frame 切换到 iframe
1.1.2 使用name/id
前提:frame或iframe中必须具有id/name属性
缺点:id、name 如果在页面上不唯一,那么会切换找到的第一个
1 | # 通过 id 切换框架 |
直接switch_to.frame的id/name就行,不需要标注是id还是name
1.1.3 使用索引
1 | # 基于索引切换到第 2 个 iframe |
index从0开始,和python的列表下标一样
1.2. 离开框架
1 | # 切回到默认内容,切换到主文档 |
1 | <div id="modal"> |
1 | # 切换到父iframe |
2、 跳过登录的几种方法
2.1 复用已有浏览器
github地址: https://github.com/Abilish/seleniumPractice
py文件:test_reuse.py
不需要每次都弹出新的页面,直接复用已登录页面
2.1.1 把chrome浏览器应用地址放入环境变量
也可以cd到chrome.exe文件夹中
目的:可以用命令行启动
2.1.2命令行启动调试模式
1 | chrome --remote-debugging-port=9222 |
9222 是端口号,并非一定是这个端口,可以随便取
2.1.3 代码编写
①在代码中导入所用浏览器(chrome/firefox…)的Options,debugger_address的端口要和命令行中chrome打开的调试端口一一对应
②设置options:
1 | webdriver.Chrome(options=options) |
更改代码总览:
1 | ...... |
此时,运行代码,会直接复用命令行打开的页面,如果在打开的页面登录,那么会保持已登录状态。
注意:此时不要开启多个浏览器窗口,只能唯一保留当前端口的浏览器窗口,否则会出错。
2.2 使用cookie
cookie是状态信息,一般根据session来判定
2.2.1 直接获取cookie
py文件:test_cookie.py
- 在2 .1 的基础上使用,即通过复用浏览器获取cookies
1 | print(self.driver.get_cookies()) |
- 得到cookies创建一个变量(cookies)进行存储
- 关闭复用模式,打开页面,逐一添加cookie
1 | self.driver.get('https://work.weixin.qq.com/wework_admin/frame') |
2.2.2 可能会导致失败的原因
Cookie中的expiry可能为小数
expiry为cookie的有效期,以秒为单位
1 | 当Servlet向客户端写Cookie时,还可以通过Cookie类的setMaxAge(intexpiry)方法来设置Cookie的有效期。参数expiry以秒为单位,它具有以下含义: |
解决方法:去掉
2.2.3 使用shelve存储
py文件:test_coshelve.py
复用浏览器,使用shelve将cookies存储在cookies文件中
1 | # 打开2.1复用浏览器,使用shelve获取并存储cookie |
3、常见其他操作
3.1 Selenium调用js
execute_script
1 | driver.execute_script("JS语句") |
4、项目一
github地址:
项目描述: