目录

  1. 1 多个iframe切换
    1. 1.0 基础知识
    2. 1.1 切换frame
      1. 1.1.1 使用WebElement方法
      2. 1.1.2 使用name/id
      3. 1.1.3 使用索引
    3. 1.2. 离开框架
  2. 2、 跳过登录的几种方法
    1. 2.1 复用已有浏览器
      1. 2.1.1 把chrome浏览器应用地址放入环境变量
      2. 2.1.2命令行启动调试模式
      3. 2.1.3 代码编写
    2. 2.2 使用cookie
      1. 2.2.1 直接获取cookie
      2. 2.2.2 可能会导致失败的原因
      3. 2.2.3 使用shelve存储
  3. 3、常见其他操作
    1. 3.1 Selenium调用js
  4. 4、项目一

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
2
3
4
5
<div id="modal">
<iframe id="buttonframe"name="myframe"src="https://seleniumhq.github.io">
<button>Click here</button>
</iframe>
</div>

这是部分HTML网页,我们希望定位到 iframe 框架内的按钮 button。

若我们直接采用元素定位是无法定位到的,selenium提供了三种定位方法。

其思路是先切换到iframe框架内,然后对其中某一元素进行操作,最后离开框架

1.1 切换frame

1
driver.switch_to.frame(param)

传入的参数param可以为iframe元素的:

  • id、name、index属性

  • ​ 定位该iframe所返回的Selenium的WebElement对象

1
2
3
4
5
driver.switch_to.frame(0)     			# index索引定位
driver.switch_to.frame("frameid") # id定位
driver.switch_to.frame("frameneme") # name定位
driver.switch_to.frame(get_driver.find_element_by_id(
'frameid')) # WebElement定位

1.1.1 使用WebElement方法

优点:灵活

1
2
3
4
5
6
7
8
    # 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")

# 切换到选择的 iframe
driver.switch_to.frame(iframe)

# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
  1. 使用元素定位找到iframe的位置

  2. switch_to.frame 切换到 iframe

1.1.2 使用name/id

前提:frame或iframe中必须具有id/name属性

缺点:id、name 如果在页面上不唯一,那么会切换找到的第一个

1
2
    # 通过 id 切换框架
driver.switch_to.frame('buttonframe')

直接switch_to.frame的id/name就行,不需要标注是id还是name

1.1.3 使用索引

1
2
3
4
5
    # 基于索引切换到第 2 个 iframe
iframe = driver.find_elements_by_tag_name('iframe')[1]

# 切换到选择的 iframe
driver.switch_to.frame(iframe)

index从0开始,和python的列表下标一样

1.2. 离开框架

1
2
    # 切回到默认内容,切换到主文档
driver.switch_to.default_content()
1
2
3
4
5
6
7
<div id="modal">
<iframe id="buttonframe"name="myframe"src="https://seleniumhq.github.io">
<button>Click here</button>
<iframe>
</iframe>
</iframe>
</div>
1
2
	# 切换到父iframe
driver.switch_to.parent_frame()

2、 跳过登录的几种方法

2.1 复用已有浏览器

github地址: https://github.com/Abilish/seleniumPractice

py文件:test_reuse.py

不需要每次都弹出新的页面,直接复用已登录页面

2.1.1 把chrome浏览器应用地址放入环境变量

也可以cd到chrome.exe文件夹中

目的:可以用命令行启动

环境变量chrome.png

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
3
4
5
6
7
8
9
10
......
from selenium.webdriver.chrome.options import Options # 增加

class TestDemo():
def setup_method(self, method):
options = Options() # 增加
options.debugger_address = '127.0.0.1:9222' # 这里的端口号要和2.1.2中的命令行打开的端口保持一致 增加
self.driver = webdriver.Chrome(options=options) # 更改

......

此时,运行代码,会直接复用命令行打开的页面,如果在打开的页面登录,那么会保持已登录状态。

注意:此时不要开启多个浏览器窗口,只能唯一保留当前端口的浏览器窗口,否则会出错。

2.2 使用cookie

cookie是状态信息,一般根据session来判定

2.2.1 直接获取cookie

py文件:test_cookie.py

  1. 在2 .1 的基础上使用,即通过复用浏览器获取cookies
1
print(self.driver.get_cookies())
  1. 得到cookies创建一个变量(cookies)进行存储
  2. 关闭复用模式,打开页面,逐一添加cookie
1
2
3
self.driver.get('https://work.weixin.qq.com/wework_admin/frame')
for cookie in cookies:
self.driver.add_cookie(cookie)

2.2.2 可能会导致失败的原因

Cookie中的expiry可能为小数

expiry为cookie的有效期,以秒为单位

1
2
3
4
5
6
7
8
9
10
11
当Servlet向客户端写Cookie时,还可以通过Cookie类的setMaxAge(intexpiry)方法来设置Cookie的有效期。参数expiry以秒为单位,它具有以下含义:

·如果expiry大于零,就指示浏览器在客户端硬盘上保存Cookie的时间为expriy秒。

·如果expiry等于零,就指示浏览器删除当前Cookie。

·如果expiry小于零,就指示浏览器不要把Cookie保存到客户端硬盘。Cookie仅仅存在于当前浏览器进程中,当浏览器进程关闭,Cookie也就消失。

Cookie默认的有效期为-1。对于来自客户端的Cookie,Servlet可以通过Cookie类的getMaxAge()方法来读取Cookie的有效期。

————https://www.cnblogs.com/tanzq/p/8075473.html

解决方法:去掉

2.2.3 使用shelve存储

py文件:test_coshelve.py

复用浏览器,使用shelve将cookies存储在cookies文件中

1
2
3
4
5
# 打开2.1复用浏览器,使用shelve获取并存储cookie
db = shelve.open("cookies")
db["cookie"] = self.driver.get_cookies()
...
db.close()

3、常见其他操作

3.1 Selenium调用js

execute_script

1
driver.execute_script("JS语句")

4、项目一

github地址:

项目描述: