DrissionPage/docs/WebPage使用方法/3.1创建页面对象.md
2023-01-11 18:37:33 +08:00

289 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

在入门指南的上手示例一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。
常用的页面对象有 3 种:
- `WebPage`:整合 d 模式和 s 模式于一体的页面对象
- `ChromiumPage`:单纯用于操作浏览器的页面对象
- `SessionPage`:单纯用于收发数据包的页面对象
这 3 种页面对象的使用逻辑是一致的,使用时可根据实际须要选择使用。
!>**注意:**<br>如果有已经打开的同类型浏览器,请先关闭,或者按照下文“多浏览器共存”内容设置。否则会报错。
# ✔️ 直接创建
这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,它会自动读取配置。
```python
# 默认以 d 模式创建页面对象
page = WebPage()
# 指定以 s 模式创建页面对象
page = WebPage('s')
# 用 ChromiumPage 创建页面对象
page = ChromiumPage()
# 用 SessionPage 创建页面对象
page = SessionPage()
```
默认配置文件中,程序使用 9222 端口启动浏览器,浏览器路径为`'chrome'`。如路径中没找到浏览器执行文件Windows 系统下程序会在注册表中查找路径。
如果都没找到,则要用下一种方式手动配置路径。
# ✔️ 通过配置信息创建
本库有两种管理配置信息的对象,`DriverOptions``SessionOptions`,分别对应控制浏览器和收发数据包的配置。须要时,可以创建相应的配置对象进行设置。
## 📍 `DriverOptions`
`DriverOptions`用于管理创建浏览器时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
**◽ 初始化参数:**
| 名称 | 类型 | 默认 | 说明 |
| ----------- | ------ | ------ | ------------------------ |
| `read_file` | `bool` | `True` | 是否从 ini 文件中读取配置信息 |
| `ini_path` | `str` | `None` | 文件路径,为`None`则读取默认 ini 文件 |
!>**注意:**<br>浏览器创建后再修改这个配置是没有效果的。
```python
# 导入 DriverOptions
from DrissionPage import WebPage, DriverOptions
# 创建浏览器配置对象,指定浏览器路径
do = DriverOptions().set_paths(browser_path=r'D:\chrome.exe')
# 用该配置创建页面对象
page = WebPage(driver_or_options=do)
```
## 📍 `SessionOptions`
`SessionOptions`用于管理创建`Session`对象时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
**◽ 初始化参数:**
| 名称 | 类型 | 默认 | 说明 |
| ----------- | ------ | ------ | ------------------------ |
| `read_file` | `bool` | `True` | 是否从 ini 文件中读取配置信息 |
| `ini_path` | `str` | `None` | 文件路径,为`None`则读取默认 ini 文件 |
!>**注意:**<br> `Session`对象创建后再修改这个配置是没有效果的。
```python
# 导入 SessionOptions
from DrissionPage import SessionPage SessionOptions
proxies = {'http': 'http://127.0.0.1:1080',
'https': 'http://127.0.0.1:1080'}
# 创建配置对象,不从 ini 文件读取,并设置代理信息
so = SessionOptions(read_file=False).set_proxies(proxies)
# 用该配置创建页面对象
page = SessionPage(session_or_options=so)
```
`WebPage`创建时浏览器配置和`Session`对象配置是可以同时使用的,不会互相影响。
```python
page = WebPage(session_or_options=so, driver_or_options=do)
```
?>**Tips**<br>您可以把配置保存到配置文件以后自动读取,详见”启动配置“章节。
## 📍 直接指定地址创建
`ChromiumPage`可以直接接收浏览器地址来创建,格式为 'ip:port'。
```python
page = ChromiumPage(addr_driver_opts='127.0.0.1:9333')
```
## 📍 使用其它 ini 文件创建
以上方法是使用默认 ini 文件中保存的配置信息创建对象,你可以保存一个 ini 文件到别的地方,并在创建对象时指定使用它。
```python
from DrissionPage import WebPage, DriverOptinos
# 创建配置对象时指定要读取的ini文件路径
do = DriverOptinos(ini_path=r'./config1.ini')
# 使用该配置对象创建页面
page = WebPage(driver_or_options=do)
```
# ✔️ 传递控制权
当须要使用多个页面对象共同操作一个页面时,可在对象间传递驱动器。
```python
from DrissionPage import WebPage
# 创建第一个页面
page1 = WebPage()
# 获取页面对象的浏览器控制器
driver = page1.driver
# 获取页面对象的Session对象
session = page1.session
# 把两个控制器对象在第二个页面对象初始化时传递进去
page2 = WebPage(driver_or_options=driver, session_or_options=session)
```
# ✔️ 接管已打开的浏览器
页面对象创建时,只要指定的 ip:port 中已有浏览器在运行,就会直接接管。无论浏览器是下面哪种方式启动的。
## 📍 用程序启动的浏览器
默认情况下,创建浏览器页面对象时会自动启动一个浏览器。只要这个浏览器不关闭,下次运行程序时会接管同一个浏览器继续操作(配置的 ip:port 信息不变)。
这种方式极大地方便了程序的调试,使程序不必每次重新开始,可以单独调试某个功能。
```python
from DrissionPage import ChromiumPage
# 创建对象同时启动浏览器,如果浏览器已经存在,则接管它
page = ChromiumPage()
```
## 📍 手动打开的浏览器
如果须要手动打开浏览器再接管,可以这样做:
- 右键点击浏览器图标,选择属性
- 在“目标”路径后面加上` --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)
```
!> **注意:**<br>接管浏览器时只有`local_port``debugger_address`参数是有效的。
## 📍 bat 文件启动的浏览器
可以把上一种方式的目标路径设置写进 bat 文件Windows系统运行 bat 文件来启动浏览器,再用程序接管。
新建一个文本文件,在里面输入以下内容(路径改为自己电脑的):
```console
"D:\chrome.exe" --remote-debugging-port=9222
```
保存后把后缀改成 bat然后双击运行就能在 9222 端口启动一个浏览器。程序代码则和上一个方法一致。
# ✔️ 多浏览器共存
## 📍 用程序启动的浏览器
如果想要同时操作多个浏览器,或者自己在使用其中一个上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的**端口**和**用户文件夹**,否则会造成冲突。具体用`DriverOptions`对象进行设置,示例如下:
```python
from DrissionPage import ChromiumPage, 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 = ChromiumPage(driver_or_options=do1)
page2 = ChromiumPage(driver_or_options=do2)
# 每个页面对象控制一个浏览器
page1.get('https://www.baidu.com')
page2.get('http://www.163.com')
```
?>**Tips**<br>每个浏览器都要设置独立的端口号和用户文件夹,二者缺一不可。
## 📍 bat 文件启动的浏览器
如果要接管多个 bat 文件打开的浏览器,每个浏览器的参数都要添加`--remote-debugging-port``--user-data-dir`参数。浏览器路径则是一样的。示例如下:
bat 文件1
```
"D:\chrome.exe" --remote-debugging-port=9111 --user-data-dir=D:\data1
```
bat 文件2
```
"D:\chrome.exe“ --remote-debugging-port=9222 --user-data-dir=D:\data2
```
程序代码:
```python
from DrissionPage import ChromiumPage, DriverOptions
do1 = DriverOptions().set_paths(local_port=9111)
do2 = DriverOptions().set_paths(local_port=9222)
page1 = ChromiumPage(driver_or_options=do1)
page2 = ChromiumPage(driver_or_options=do2)
```
# ✔️ 页面对象初始化 API
## 📍 `ChromiumPage`
`ChroumiumPage`对象纯粹用于操作浏览器,不能切换模式。一个该对象对应的是浏览器上一个标签页。
**◽ 初始化参数:**
| 名称 | 类型 | 默认 | 说明 |
| ------------------ | -------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- |
| `addr_driver_opts` | `str``ChromiumDriver``DriverOptions` | `None` | 浏览器启动配置或接管信息;传入' ip:port' 字符串或`ChromiumDriver`时接管浏览器,传入`DriverOptions`时按配置启动浏览器,为`None`时使用配置文件配置启动浏览器 |
| `tab_id` | `str` | `None` | 要控制的标签页id用于 d 模式,为`None`则控制激活的标签页 |
| `timeout` | `float` | `None` | 整体超时时间,为`None`则从配置文件中读取 |
## 📍 `SessionPage`
`SessionPage`对象纯粹用于收发数据包,不能切换模式,产生的元素对象为`SessionElement`
**◽ 初始化参数:**
| 名称 | 类型 | 默认 | 说明 |
| -------------------- | -------------------------- | ------ | --------------------------------------------------------------- |
| `session_or_options` | `Session``SessionOptions` | `None` | 传入`Session`对象时使用该对象收发数据包;传入`SessionOptions`对象时用该配置创建`Session`对象 |
| `timeout` | `float` | `None` | 连接超时时间, |
## 📍 `WebPage`
`WebPage`对象封装了常用的网页操作,并实现在浏览器和 requests 两种模式之间的切换。
**◽ 初始化参数:**
| 名称 | 类型 | 默认 | 说明 |
| -------------------- | --------------------------------------- | ------ | ---------------------------------------------------------------- |
| `mode` | `str` | `'d'` | 启动时的模式,只能传入`'d'``'s'` |
| `timeout` | `float` | `None` | 整体超时时间,为`None`则从配置文件中读取 |
| `tab_id` | `str` | `None` | 要控制的标签页id用于 d 模式,为`None`则控制激活的标签页 |
| `driver_or_options` | `ChromiumDriver``DriverOptions``bool` | `None` | 浏览器控制对象或浏览器启动配置对象;为`None`时使用 ini 文件配置;为`False`时不读取 ini 文件。 |
| `session_or_options` | `Session``SessionOptions``bool` | `None` | 收发数据包对象或`Session`启动配置对象;为`None`时使用 ini 文件配置;为`False`时不读取 ini 文件。 |
**◽ 说明:**
`driver_or_options``session_or_options`传入`ChromiumDriver``Session`对象时,可在多个页面对象间传递控制权。