mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
208 lines
7.9 KiB
Markdown
208 lines
7.9 KiB
Markdown
在入门指南的快速上手一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。
|
||
|
||
# ✔️ `WebPage`类
|
||
|
||
`WebPage`对象封装了常用的网页操作,并实现在浏览器和 requests 两种模式之间的切换。
|
||
|
||
初始化参数:
|
||
|
||
- mode:初始化时模式,`'d'`或`'s'`,默认为`'d'`
|
||
- timeout:超时时间,s 模式时为连接时间,d 模式时为查找元素、处理弹出框、输入文本等超时时间
|
||
- driver_or_options:`Tab`对象或`DriverOptions`对象,为`None`时使用 ini 文件配置,为`False`时不读取 ini 文件
|
||
- session_or_options:`Session`对象或`SessionOptions`对象,为`None`时使用 ini 文件配置,为`False`时不读取 ini 文件
|
||
|
||
# ✔️ 直接创建
|
||
|
||
这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
|
||
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,也可以直接把配置写在代码里。
|
||
?>**Tips:**<br>默认配置文件中,程序使用 9222 端口启动浏览器,浏览器路径为 Chrome。如路径中没找到浏览器执行文件,Windows 系统下程序会在注册表中查找路径,如果还是没找到,则要用下一种方式手动配置路径。
|
||
|
||
```python
|
||
# 默认以 d 模式创建页面对象
|
||
page = WebPage('d')
|
||
|
||
# 指定以 s 模式创建页面对象
|
||
page = WebPage('s')
|
||
```
|
||
|
||
# ✔️ 通过配置信息创建
|
||
|
||
本库有两种管理配置信息的对象,`DriverOptions`和`SessionOptions`,分别对应 d 模式和 s 模式的配置。须要时,可以创建相应的配置对象进行设置。
|
||
|
||
## 📍 `DriverOptions`类
|
||
|
||
`DriverOptions`用于管理创建浏览器时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
|
||
|
||
初始化参数:
|
||
|
||
- read_file:是否从 ini 文件中读取配置信息
|
||
- ini_path:ini 文件路径,为`None`则读取默认 ini 文件
|
||
|
||
!>**注意:**<br>浏览器创建后再修改这个配置是没有效果的。
|
||
|
||
```python
|
||
# 导入 DriverOptions
|
||
from DrissionPage import WebPage, DriverOptions
|
||
|
||
# 创建浏览器配置对象,指定浏览器路径和运行端口
|
||
do = DriverOptions().set_paths(chrome_path=r'D:\chrome.exe', local_port=9333)
|
||
# 用该配置创建页面对象
|
||
page = WebPage(driver_or_options=do)
|
||
```
|
||
|
||
## 📍 `SessionOptions`类
|
||
|
||
`SessionOptions`用于管理创建`Session`对象时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
|
||
|
||
初始化参数:
|
||
|
||
- read_file:是否从 ini 文件中读取配置信息
|
||
- ini_path:ini 文件路径,为`None`则读取默认 ini 文件
|
||
|
||
!>**注意:**<br> `Session`对象创建后再修改这个配置是没有效果的。
|
||
|
||
```python
|
||
# 导入 SessionOptions
|
||
from DrissionPage import WebPage, SessionOptions
|
||
|
||
proxies = {'http': 'http://127.0.0.1:1080',
|
||
'https': 'https://127.0.0.1:1080'}
|
||
|
||
# 创建配置对象,不从 ini 文件读取,并设置代理信息
|
||
so = SessionOptions(read_file=False).set_proxies(proxies)
|
||
# 用该配置创建页面对象(s 模式)
|
||
page = WebPage(mode='s', session_or_options=so)
|
||
```
|
||
|
||
d 模式的配置和 s 模式的配置是可以同时使用的,不会互相影响。
|
||
|
||
```python
|
||
page = WebPage(mode='s', session_or_options=so, driver_or_options=do)
|
||
```
|
||
|
||
## 📍 使用其它 ini 文件创建
|
||
|
||
以上方法是使用默认 ini 文件中保存的配置信息创建对象,你可以保存一个 ini 文件到别的地方,并在创建对象时指定使用它。
|
||
|
||
```python
|
||
from DrissionPage import WebPage, DriverOptinos
|
||
|
||
do = DriverOptinos(ini_path=r'./config1.ini')
|
||
page = WebPage(driver_or_options=do)
|
||
```
|
||
|
||
# ✔️ 传递驱动器
|
||
|
||
当须要使用多个页面对象共同操作一个页面时,可在对象间传递驱动器。
|
||
|
||
```python
|
||
from DrissionPage import WebPage
|
||
|
||
page1 = WebPage()
|
||
driver = page1.driver
|
||
session = page1.session
|
||
page2 = WebPage(driver_or_options=driver, session_or_options=session)
|
||
```
|
||
|
||
# ✔️ 接管手动打开的浏览器
|
||
|
||
如果须要手动打开浏览器再接管,可以这样做:
|
||
|
||
- 右键点击浏览器图标,选择属性
|
||
|
||
- 在“目标”路径后面加上` --remote-debugging-port=端口号`(注意最前面有个空格)
|
||
|
||
- 点击确定
|
||
|
||
- 在程序中的浏览器配置中指定接管该端口浏览器,如下:
|
||
|
||
```
|
||
# 文件快捷方式的目标路径设置
|
||
D:\chrome.exe --remote-debugging-port=9222
|
||
```
|
||
|
||
```python
|
||
from DrissionPage import WebPage, DriverOptions
|
||
|
||
do = DriverOptions().set_paths(local_port=9222)
|
||
page = WebPage(driver_or_options=do)
|
||
```
|
||
|
||
?>**Tips:**<br>接管使用 bat 文件打开的浏览器也是一样做法做法。<br>接管浏览器时只有`local_port`、`debugger_address`参数是有效的。
|
||
|
||
# ✔️ 多 Chrome 浏览器共存
|
||
|
||
如果想要同时操作多个 Chrome 浏览器,或者自己在使用 Chrome 上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的端口和用户文件夹,否则会造成冲突。具体用`DriverOptions`对象进行设置,示例如下:
|
||
|
||
```python
|
||
from DrissionPage import DriverOptions
|
||
|
||
do1 = DriverOptions().set_paths(local_port=9111, user_data_path=r'D:\data1')
|
||
do2 = DriverOptions().set_paths(local_port=9222, user_data_path=r'D:\data2')
|
||
|
||
page1 = WebPage(driver_or_options=do1)
|
||
page2 = WebPage(driver_or_options=do2)
|
||
|
||
page1.get('https://www.baidu.com')
|
||
page2.get('http://www.163.com')
|
||
```
|
||
|
||
如果要接管多个手动打开的浏览器,每个浏览器后面的参数都要添加`--remote-debugging-port`和`--user-data-dir`参数。示例如下:
|
||
|
||
```
|
||
# 浏览器1目标设置
|
||
D:\chrome.exe --remote-debugging-port=9111 --user-data-dir=D:\data1
|
||
|
||
# 浏览器2目标设置
|
||
D:\chrome.exe --remote-debugging-port=9222 --user-data-dir=D:\data2
|
||
```
|
||
|
||
```python
|
||
from DrissionPage import DriverOptions
|
||
|
||
do1 = DriverOptions().set_paths(local_port=9111)
|
||
do2 = DriverOptions().set_paths(local_port=9222)
|
||
|
||
page1 = WebPage(driver_or_options=do1)
|
||
page2 = WebPage(driver_or_options=do2)
|
||
```
|
||
|
||
?> **Tips:**<br>使用 bat 文件打开浏览器再接管操作是一样的。
|
||
|
||
# ✔️ 一些技巧
|
||
|
||
事实上,本库默认启动浏览器的方式是先通过程序在 9222(或用户指定的)端口运行一个浏览器进程,然后通过程序接管。这种做法有很多好处:
|
||
|
||
## 📍 可重复使用的浏览器对象
|
||
|
||
当程序运行完毕,浏览器不会主动关闭,下次再运行的时候可以直接在当前状态下继续运行。于是无须每次打开新的浏览器对象,无须从最开始步骤重新运行整个程序,一些前置条件(如登录)也无须每次运行,大大提高开发效率。
|
||
|
||
## 📍 简便的调试方式
|
||
|
||
通过重复使用浏览器对象,用户可以把浏览器页面调整到某个状态再用程序接管,对调试某个特定问题效率极高。比如有些通过很多步骤才能到达的页面,如果每次重新运行会花费大量时间,而将页面固定再由程序接管,测试各种细节非常方便快捷。
|
||
|
||
## 📍 一行代码传递登录状态到 requests
|
||
|
||
本库的一个特点是打通了浏览器和`requests`之间的登录状态,我们可以手动登录浏览器,再用程序接管,然后切换到 s 模式,这时 s 模式的`Session`对象即已活动浏览器的登录信息,无须用`requests`
|
||
处理登录过程,极大地简化了开发复杂程度。示例:
|
||
|
||
```python
|
||
# 假设已在 9222 端口打开了一个浏览器,并已登录某网站
|
||
from DrissionPage import WebPage
|
||
|
||
page = WebPage() # 用 d 模式创建页面对象,默认接管 9222 端口
|
||
page.change_mode() # 切换到 s 模式,即使用 requests 进行操作
|
||
page.get('某url...') # 即可已登录状态访问
|
||
```
|
||
|
||
使用其它端口号:
|
||
|
||
```python
|
||
from DrissionPage import WebPage, DriverOptions
|
||
|
||
do = DriverOptions().set_paths(local_port=9333)
|
||
page = WebPage(driver_or_option=do)
|
||
page.change_mode()
|
||
page.get('某url...')
|
||
```
|