DrissionPage/docs/WebPage使用方法/3.1创建页面对象.md
2022-12-18 22:58:30 +08:00

208 lines
7.9 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.

在入门指南的快速上手一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。
# ✔️ `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_pathini 文件路径,为`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_pathini 文件路径,为`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...')
```