Skip to content

🔨 创建页面对象

在入门指南的快速上手一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。
页面对象类型为MixPage,通过MixPage()创建。
可以通过指定配置信息创建须要的页面对象,如无界面的浏览器、是否加载插件、是否接管已打开的浏览器、设置headers、设置代理等等。
这些配置信息,可以通过几种方式设置。配置的详细用法后文再讲。本节先了解创建页面对象的几种方式。

✅️️ MixPage

MixPage页面对象封装了常用的网页操作,并实现在两种模式之间的切换。
MixPage须控制一个Drission对象并使用其中的WebDriverSession对象来实现。对浏览器或网络连接的操作。如没有传入,MixPage会自己创建一个(使用传入的配置信息或从默认 ini 文件读取)。

初始化参数:

  • mode:初始化时模式,'d''s',默认为'd'
  • drission:Drission 对象,不传入时会自动创建
  • timeout:超时时间,s 模式时为连接时间,d 模式时为查找元素、处理弹出框、输入文本等超时时间
  • driver_options:浏览器设置,没传入drission参数时会用这个设置新建Drission对象中的WebDriver对象,传入False则不创建
  • session_options:requests 设置,没传入drission参数时会用这个设置新建Drission对象中的Session对象,传入False则不创建

注意

有传入drission参数时,driver_optionssession_options参数无效

✅️️ 直接创建

这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,也可以直接把配置写在代码里。

# 默认以 d 模式创建页面对象
page = MixPage('d')

# 指定以 s 模式创建页面对象
page = MixPage('s')

✅️️ 通过配置信息创建

本库有两种管理配置信息的对象,分别是DriverOptionsSessionOptions,对应 d 模式和 s 模式的配置。
须要时,可以创建相应的配置对象进行设置。

📌 DriverOptions

DriverOptions用于管理创建浏览器时的配置,浏览器创建后再修改这个配置是没有效果的。
DriverOptions对象能实现链式操作。

初始化参数:

  • read_file:是否从 ini 文件中读取配置信息
  • ini_path:ini 文件路径,为None则读取默认 ini 文件
# 导入 DriverOptions
from MixPage 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 文件

注意

Session对象创建后再修改这个配置是没有效果的。

# 导入 DriverOptions
from MixPage 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 模式的配置是可以同时使用的,不会互相影响。

page = MixPage(mode='s', session_options=so, driver_options=do)

✅️️ 传入Drission对象创建

在入门指南的基本概念一节里,我们讲过Drission对象相当于驱动器的角色。事实上,上述两种方式,MixPage都会自动创建一个Drission对象用于管理与网站或浏览器的连接,我们当然也可以手动创建并传入MixPage
Drission一般是不用手动创建的,要手动创建的时候,一般是用于i以下几种情况:

  • 指定使用某个配置文件
  • 在不同MixPage间传递驱动器
  • 与 selenium 或 requests 原生代码拼接,用于兼容这两者的代码

📌 Drission

初始化参数:

  • driver_or_optionsWebDriver对象、DriverOptions对象或Options对象。传入False时自动创建一个空配置对象。
  • session_or_optionsSession对象、SessionOptions对象、Options对象或设置字典。传入False时自动创建一个空配置对象。
  • ini_path:要使用的 ini 文件的路径
  • proxy:初始化时设置代理

📌 使用其它 ini 文件创建

from MixPage import MixPage, Drission

d = Drission(ini_path=r'./config1.ini')
page = MixPage(drission=d)

📌 传递驱动器

多页面对象间共用驱动器,如多个MixPage控制一个浏览器:

from MixPage import MixPage

page1 = MixPage()
d = page1.drission
page2 = MixPage(drission=d)

📌 从 selenium 和 requests 代码传入

MixPage 的代码能和 selenium 及 requests 代码兼容,便于不同程序间的对接。
只需把WebDriver对象或Session传入Drission对象即可。

from selenium import webdriver
from requests import Session
from MixPage 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创建时能直接接收配置信息,所以这个方法基本不需要用到,写出来只是表示有这个功能。

from MixPage import DriverOptions, SessionOptions, 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
from MixPage import DriverOptions, MixPage

do = DriverOptions().set_paths(local_port=9222)
page = MixPage(driver_options=do)

Tips

接管使用 bat 文件打开的浏览器也是一样做法做法。
接管浏览器时只有local_portdebugger_addressdriver_path参数是有效的。

✅️️ 多 Chrome 浏览器共存

如果想要同时操作多个 Chrome 浏览器,或者自己在使用 Chrome 上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的端口和用户文件夹,否则会造成冲突。具体用DriverOptions对象进行设置,示例如下:

from MixPage import MixPage, 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
from MixPage import MixPage, 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

使用 bat 文件打开浏览器再接管操作是一样的。

✅️️ 一些技巧

事实上,本库默认启动浏览器的方式是先通过程序在 9222(或用户指定的)端口运行一个浏览器进程,然后通过程序接管。这种做法有很多好处:

📌 可重复使用的浏览器对象

当程序运行完毕,浏览器不会主动关闭,下次再运行的时候可以直接在当前状态下继续运行。于是无须每次打开新的浏览器对象,无须从最开始步骤重新运行整个程序,一些前置条件(如登录)也无须每次运行,大大提高开发效率。

📌 简便的调试方式

通过重复使用浏览器对象,用户可以把浏览器页面调整到某个状态再用程序接管,对调试某个特定问题效率极高。比如有些通过很多步骤才能到达的页面,如果每次重新运行会花费大量时间,而将页面固定再由程序接管,测试各种细节非常方便快捷。

📌 一行代码传递登录状态到 requests

本库的一个特点是打通了浏览器和requests之间的登录状态,我们可以手动登录浏览器,再用程序接管,然后切换到 s 模式,这时 s 模式的Session对象即已活动浏览器的登录信息,无须用requests 处理登录过程,极大地简化了开发复杂程度。示例:

# 假设已在 9222 端口打开了一个浏览器,并已登录某网站
from MixPage import MixPage

page = MixPage()  # 用 d 模式创建页面对象,默认接管 9222 端口
page.change_mode()  # 切换到 s 模式,即使用 requests 进行操作
page.get('某url...')  # 即可已登录状态访问

使用其它端口号:

from MixPage import MixPage, DriverOptions

do = DriverOptions().set_paths(local_port=9333)
page = MixPage(driver_option=do)
page.change_mode()
page.get('某url...')