DrissionPage/docs/8_MixPage/1_create_page_object.md
2023-02-03 00:03:36 +08:00

263 lines
10 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.

在入门指南的快速上手一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。
页面对象类型为`MixPage`,通过`MixPage()`创建。
可以通过指定配置信息创建须要的页面对象,如无界面的浏览器、是否加载插件、是否接管已打开的浏览器、设置`headers`、设置代理等等。
这些配置信息,可以通过几种方式设置。配置的详细用法后文再讲。本节先了解创建页面对象的几种方式。
# ✔️ `MixPage`类
`MixPage`页面对象封装了常用的网页操作,并实现在两种模式之间的切换。
`MixPage`须控制一个`Drission`对象并使用其中的`WebDriver``Session`对象来实现。对浏览器或网络连接的操作。如没有传入,`MixPage`会自己创建一个(使用传入的配置信息或从默认 ini 文件读取)。
**初始化参数:**
- `mode`:初始化时模式,`'d'``'s'`,默认为`'d'`
- `drission`Drission 对象,不传入时会自动创建
- `timeout`超时时间s 模式时为连接时间d 模式时为查找元素、处理弹出框、输入文本等超时时间
- `driver_options`:浏览器设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`WebDriver`对象,传入`False`则不创建
- `session_options`requests 设置,没传入`drission`参数时会用这个设置新建`Drission`对象中的`Session`对象,传入`False`则不创建
!> **注意:** <br>有传入`drission`参数时,`driver_options``session_options`参数无效
# ✔️ 直接创建
这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,也可以直接把配置写在代码里。
```python
# 默认以 d 模式创建页面对象
page = MixPage('d')
# 指定以 s 模式创建页面对象
page = MixPage('s')
```
# ✔️ 通过配置信息创建
本库有两种管理配置信息的对象,分别是`DriverOptions``SessionOptions`,对应 d 模式和 s 模式的配置。
须要时,可以创建相应的配置对象进行设置。
## 📍 `DriverOptions`类
`DriverOptions`用于管理创建浏览器时的配置,浏览器创建后再修改这个配置是没有效果的。
`DriverOptions`对象能实现链式操作。
**初始化参数:**
- `read_file`:是否从 ini 文件中读取配置信息
- `ini_path`ini 文件路径,为`None`则读取默认 ini 文件
```python
# 导入 DriverOptions
from DrissionPage import MixPage, DriverOptions
# 创建浏览器配置对象,从文件读取配置,并增加设置浏览器静音和不加载图片
do = DriverOptions().set_mute().set_no_imgs()
# 用该配置创建页面对象
page = MixPage(driver_options=do)
```
## 📍 `SessionOptions`类
`SessionOptions`用于管理创建`Session`对象时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。
**初始化参数:**
- `read_file`:是否从 ini 文件中读取配置信息
- `ini_path`ini 文件路径,为`None`则读取默认 ini 文件
!>**注意:**<br>`Session`对象创建后再修改这个配置是没有效果的。
```python
# 导入 DriverOptions
from DrissionPage import MixPage,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 = MixPage(mode='s', session_options=so)
```
d 模式的配置和 s 模式的配置是可以同时使用的,不会互相影响。
```python
page = MixPage(mode='s', session_options=so, driver_options=do)
```
# ✔️ 传入`Drission`对象创建
在入门指南的基本概念一节里,我们讲过`Drission`对象相当于驱动器的角色。事实上,上述两种方式,`MixPage`都会自动创建一个`Drission`对象用于管理与网站或浏览器的连接,我们当然也可以手动创建并传入`MixPage`
`Drission`一般是不用手动创建的要手动创建的时候一般是用于i以下几种情况
- 指定使用某个配置文件
- 在不同`MixPage`间传递驱动器
- 与 selenium 或 requests 原生代码拼接,用于兼容这两者的代码
## 📍 `Drission`类
**初始化参数:**
- `driver_or_options``WebDriver`对象、`DriverOptions`对象或`Options`对象。传入`False`时自动创建一个空配置对象。
- `session_or_options``Session`对象、`SessionOptions`对象、`Options`对象或设置字典。传入`False`时自动创建一个空配置对象。
- `ini_path`:要使用的 ini 文件的路径
- `proxy`:初始化时设置代理
## 📍 使用其它 ini 文件创建
```python
from DrissionPage import MixPage, Drission
d = Drission(ini_path=r'./config1.ini')
page = MixPage(drission=d)
```
## 📍 传递驱动器
多页面对象间共用驱动器,如多个`MixPage`控制一个浏览器:
```python
from DrissionPage import MixPage
page1 = MixPage()
d = page1.drission
page2 = MixPage(drission=d)
```
## 📍 从 selenium 和 requests 代码传入
DrissionPage 的代码能和 selenium 及 requests 代码兼容,便于不同程序间的对接。
只需把`WebDriver`对象或`Session`传入`Drission`对象即可。
```python
from selenium import webdriver
from requests import Session
from DrissionPage import Drission, MixPage
driver = webdriver.Chrome()
session = Session()
d = Drission(driver_or_options=driver, session_or_options=session)
page = MixPage(drission=d)
page.get('https://www.baidu.com')
```
## 📍 用配置信息创建
因为`MixPage`创建时能直接接收配置信息,所以这个方法基本不需要用到,写出来只是表示有这个功能。
```python
from DrissionPage.config import DriverOptions, SessionOptions
from DrissionPage import Drission, MixPage
do = DriverOptions()
so = SessionOptions()
d = Drission(driver_or_options=do, session_or_options=so)
page = MixPage(drission=d)
```
# ✔️ 接管手动打开的浏览器
如果须要手动打开浏览器,手动操作后再接管,可以这样做:
- 右键点击浏览器图标,选择属性
- 在“目标”路径后面加上` --remote-debugging-port=端口号`(注意最前面有个空格)
- 点击确定
- 在程序中的浏览器配置中指定接管该端口浏览器,如下:
```
# 文件快捷方式的目标路径设置
D:\chrome.exe --remote-debugging-port=9222
```
```python
from DrissionPage.config import DriverOptions
from DrissionPage import MixPage
do = DriverOptions().set_paths(local_port=9222)
page = MixPage(driver_options=do)
```
?>**Tips**<br>接管使用 bat 文件打开的浏览器也是一样做法做法。<br>接管浏览器时只有`local_port``debugger_address``driver_path`参数是有效的。
# ✔️ 多 Chrome 浏览器共存
如果想要同时操作多个 Chrome 浏览器,或者自己在使用 Chrome 上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的端口和用户文件夹,否则会造成冲突。具体用`DriverOptions`对象进行设置,示例如下:
```python
from DrissionPage.config 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 = MixPage(driver_options=do1)
page2 = MixPage(driver_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.config import DriverOptions
do1 = DriverOptions().set_paths(local_port=9111)
do2 = DriverOptions().set_paths(local_port=9222)
page1 = MixPage(driver_options=do1)
page2 = MixPage(driver_options=do2)
```
?> **Tips**<br>使用 bat 文件打开浏览器再接管操作是一样的。
# ✔️ 一些技巧
事实上,本库默认启动浏览器的方式是先通过程序在 9222或用户指定的端口运行一个浏览器进程然后通过程序接管。这种做法有很多好处
## 📍 可重复使用的浏览器对象
当程序运行完毕,浏览器不会主动关闭,下次再运行的时候可以直接在当前状态下继续运行。于是无须每次打开新的浏览器对象,无须从最开始步骤重新运行整个程序,一些前置条件(如登录)也无须每次运行,大大提高开发效率。
## 📍 简便的调试方式
通过重复使用浏览器对象,用户可以把浏览器页面调整到某个状态再用程序接管,对调试某个特定问题效率极高。比如有些通过很多步骤才能到达的页面,如果每次重新运行会花费大量时间,而将页面固定再由程序接管,测试各种细节非常方便快捷。
## 📍 一行代码传递登录状态到 requests
本库的一个特点是打通了浏览器和`requests`之间的登录状态,我们可以手动登录浏览器,再用程序接管,然后切换到 s 模式,这时 s 模式的`Session`对象即已活动浏览器的登录信息,无须用`requests`
处理登录过程,极大地简化了开发复杂程度。示例:
```python
# 假设已在 9222 端口打开了一个浏览器,并已登录某网站
from DrissionPage import MixPage
page = MixPage() # 用 d 模式创建页面对象,默认接管 9222 端口
page.change_mode() # 切换到 s 模式,即使用 requests 进行操作
page.get('某url...') # 即可已登录状态访问
```
使用其它端口号:
```python
from DrissionPage.config import DriverOptions
from DrissionPage import MixPage
do = DriverOptions().set_paths(local_port=9333)
page = MixPage(driver_option=do)
page.change_mode()
page.get('某url...')
```