Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解

news2025/3/29 1:46:32

Python自动化测试 之 DrissionPage 使用详解

    • 🏡前言:
    • 一、☀️DrissionPage的基本概述
    • 二、 🗺️环境安装
      • 2.1 ✅️️运行环境
      • 2.2 ✅️️一键安装
    • 三、🗺️快速入门
      • 3.1 页面类
        • 🛰️ChromiumPage
        • 🛫 SessionPage
        • 🔎WebPage
      • 3.2 🌏 准备工作
        • 3.2.1 尝试启动浏览器
        • 3.2.2 设置浏览器驱动路径
        • 3.2.3 🌏️控制浏览器
      • 3.3 收发数据包
      • 3.4 模式切换
    • 四、🗺️ChromiumPage详解
      • 4.1 启动和接管浏览器
        • 4.1.1 启动浏览器
        • 4.1.2 接管浏览器
        • 4.1.3 多浏览器共存
      • 4.2 页面交互
      • 4.3 查找元素
      • 4.4 获取元素信息的常用属性或方法
    • 五、🗺️SessionPage详解
      • 5.1 get请求
      • 5.2 post请求
      • 5.3 page对象常用属性
    • 六、🗺️WebPage详解
    • 扩展
      • ⭐下载文件
      • 🥬设置 cookies
      • ❓ 常见问题

🏡前言:

之前分享过一篇关于 自动化测试框架 Selenium 使用的文章: Python自动化测试 环境搭建 Selenium、WebDriver下载、安装、配置、基本使用详解,虽然 Selenium也很强大,但在使用下来后,感觉DrissionPage操作更简单、功能更强大一些(不像Selenium 会担心WebDriver版本对不上无法运行等情况),尤其是对新手入门来讲,DrissionPage是非常值得推荐学习的。

一、☀️DrissionPage的基本概述

DrissionPage 是一个基于 python 的网页自动化工具。它既能控制浏览器,也能像requests一样收发数据包,更重要的是还能把两者合二为一。因此,简单来说DrissionPage可兼顾浏览器自动化的便利性和 requests 的高效率。
DrissionPage功能强大,内置无数人性化设计和便捷功能。并且它的语法简洁而优雅,代码量少,对新手友好。

drissionpage

🚀官网:https://drissionpage.cn/

📚文档:https://drissionpage.cn/browser_control/intro

💖 特性:
✅️️ 强大的自研内核

  • 不依赖 webdriver
  • 无需为不同版本的浏览器下载不同的驱动
  • 运行速度更快
  • 可以跨 iframe 查找元素,无需切入切出
  • 可同时操作多个标签页,无需切换
  • 方便好用的数据包监听功能
  • 可处理非open状态的 shadow-root

✅️️ 极简的定位语法

  • 制定了一套简洁高效的查找元素语法,支持链式操作,支持相对定位。
  • 每次查找内置等待,可以独立设置每次查找超时时间。

✅️️ 更多便捷的功能

  • 可对整个网页截图,包括视口外的部分
  • 每次运行程序可以反复使用已经打开的浏览器,无需每次从头运行
  • s 模式访问网页时会自动纠正编码,无需手动设置
  • s 模式在连接时会自动根据当前域名自动填写Host和Referer属性
  • 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等
  • 支持直接获取after和before伪元素的内容
  • 上传文件可直接拦截文件选择框并输入路径,无需依靠 GUI 或查找元素输入

二、 🗺️环境安装

2.1 ✅️️运行环境

操作系统:Windows、Linux 或 Mac。

python 版本:3.6 及以上

支持浏览器:Chromium 内核(如 Chrome 和 Edge)

2.2 ✅️️一键安装

使用 pip 安装 DrissionPage:

# 安装最新版本
pip install DrissionPage

# 如果已安装,可以在命令后面加上 --upgrade 参数 升级到最新版本
pip install DrissionPage --upgrade

# 指定版本升级
pip install DrissionPage==4.0.0b17

三、🗺️快速入门

3.1 页面类

在DrissionPage框架中,有一个非常重要的工具叫做“页面类”,主要用于控制浏览器 和 收发数据包。DrissionPage 包含三种主要页面类。我们可以根据自己的需要选择使用。

🛰️ChromiumPage

如果只要控制浏览器,导入ChromiumPage

from DrissionPage import ChromiumPage
🛫 SessionPage

如果只要收发数据包,导入SessionPage

from DrissionPage import SessionPage
🔎WebPage

WebPage是功能最全面的页面类,既可控制浏览器,也可收发数据包。

from DrissionPage import WebPage

3.2 🌏 准备工作

如果只使用收发数据包功能,无需任何准备工作。
如果要控制浏览器,需设置浏览器路径。程序默认设置控制 Chrome,所以下面用 Chrome 演示。

开始前,我们先设置一下浏览器路径。
程序默认控制 Chrome,所以下面用 Chrome 演示。 如果要使用 Edge 或其它 Chromium 内核浏览器,设置方法是一样的。

3.2.1 尝试启动浏览器

默认状态下,程序会自动在系统内查找 Chrome 路径。
执行以下代码,浏览器启动并且访问了相关网站,如果访问执行成功说明可直接使用,跳过后面的步骤即可。

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://www.baidu.com')
3.2.2 设置浏览器驱动路径

如果上面的步骤提示出错,说明程序没在系统里找到 Chrome 浏览器。
可用以下其中一种方法设置,设置会持久化记录到默认配置文件,之后程序会使用该设置启动。
在这里插入图片描述

  • 📌方法1

    • 新建一个临时 py 文件,并输入以下代码,填入您电脑里的 Chrome 浏览器可执行文件路径,然后运行。

      from DrissionPage import ChromiumOptions
      
      path = r'D:\Chrome\Chrome.exe'  # 请改为你电脑内Chrome可执行文件路径
      ChromiumOptions().set_browser_path(path).save()
      

      这段代码会把浏览器路径记录到配置文件,今后启动浏览器皆以新路径为准。
      另外,如果是想临时切换浏览器路径以尝试运行和操作是否正常,可以去掉 .save(),以如下方式结合第1️⃣步的代码。

      from DrissionPage import ChromiumPage, ChromiumOptions
      
      path = r'C:\Users\Administrator\AppData\Local\Google\Chrome SxS\Application\chrome.exe'  # 请改为你电脑内Chrome可执行文件路径
      co = ChromiumOptions().set_browser_path(path)
      page = ChromiumPage(co)
      page.get('http://DrissionPage.cn')
      
  • 📌方法2

    • 在命令行输入以下命令(路径改成自己电脑里的):

      dp -p C:\Users\Administrator\AppData\Local\Google\Chrome SxS\Application\chrome.exe
      

      ⚠️注意命令行的 python 环境与项目应是同一个
      ⚠️注意要先使用 cd 命令定位到项目路径

现在,请重新执行第1️⃣步的代码,如果正确访问了目标网址,说明已经设置完成。

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://www.baidu.com')

✅️️ OK,当您完成以上准备工作以后,无需关闭浏览器,后面的上手示例可继续接管当前浏览器。

3.2.3 🌏️控制浏览器

现在,我们通过一些例子,来直观感受一下 DrissionPage 的工作方式。

本示例演示使用ChromiumPage控制浏览器登录 gitee 网站。

from DrissionPage import ChromiumPage

# 创建页面对象,并启动浏览器
page = ChromiumPage()
# 跳转到登录页面
page.get('https://gitee.com/login')

# 定位到账号文本框,获取文本框元素
ele = page.ele('#user_login')
# 输入对文本框输入账号  
ele.input('你的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('你的密码')
# 点击登录按钮:@attrName=value,这是根据属性和属性值进行标签定位的方式
page.ele('@value=登 录').click()

注意:ele()方法用于查找元素,它返回一个ChromiumElement对象,用于操作元素。值得一提的是,ele()内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。

3.3 收发数据包

本示例演示用SessionPage已收发数据包的方式采集 gitee 网站数据。这个示例的目标,要获取所有库的名称和链接,为避免对网站造成压力,我们只采集 3 页。网址:https://gitee.com/explore/all

from DrissionPage import SessionPage

# 创建页面/请求对象
page = SessionPage()

# 爬取3页
for i in range(1, 4):
    # 访问某一页的网页
    page.get(f'https://gitee.com/explore/all?page={i}')
    # 获取所有开源库<a>元素列表(所有库的链接的a标签的class属性值都是一样的)
    links = page.eles('.title project-namespace-path')
    # 遍历所有<a>元素
    for link in links:
        # 打印链接信息:
        print(link.text, link.link)

.text获取元素的文本,.link获取元素的hrefsrc属性。

3.4 模式切换

这个示例演示WebPage如何切换控制浏览器和收发数据包两种模式。
通常,切换模式是用来应付登录检查很严格的网站,可以用控制浏览器的形式处理登录,再转换模式用收发数据包的形式来采集数据。

实例:基于浏览器控制模式进行gitee的登陆,登录成功后切换模式基于收发数据包的性质访问该账户的个人主页,获取该账户主页左下角所有的组织名称。

from DrissionPage import ChromiumOptions
from DrissionPage import WebPage

# 创建页面对象
page = WebPage()
# 访问网址,进行登录
page.get('https://gitee.com/login?redirect_to_url=%2F')
# 定位到账号文本框,获取文本框元素
ele = page.ele('#user_login')
# 输入对文本框输入账号
ele.input('你的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('你的密码')
# 点击登录按钮:@attrName=value,这是根据属性和属性值进行标签定位的方式
page.ele('@value=登 录').click()

# 切换到收发数据包模式
page.change_mode() #切换的时候程序会在新模式重新访问当前 url。
#切换模式后,重新访问基于登录状态后新的url(个人主页)
page.get('https://gitee.com/muguilin')

# 根据class属性值获取div标签,然后将该div下面class为item的元素标签批量获取
items = page.ele('.ui middle aligned list').eles('.item')
# 遍历获取到的元素
for item in items:
    # 打印元素文本
    print(item('.content').text)

四、🗺️ChromiumPage详解

顾名思义,ChromiumPage是 Chromium 内核浏览器的页面,使用它,我们可与网页进行交互,如调整窗口大小、滚动页面、操作弹出框等等。还可以跟页面中的元素进行交互,如输入文字、点击按钮、选择下拉菜单、在页面或元素上运行 JavaScript 代码等等。

可以说,操控浏览器的绝大部分操作,都可以由ChromiumPage及其衍生的对象完成,而它们的功能,还在不断增加。除了与页面和元素的交互,ChromiumPage还扮演着浏览器控制器的角色,可以说,一个ChromiumPage对象,就是一个浏览器。

4.1 启动和接管浏览器

ChromiumPage()创建页面对象。根据不同的配置,可以接管已打开的浏览器,也可以启动新的浏览器。程序结束时,被打开的浏览器不会主动关闭,以便下次运行程序时使用(由 VSCode 启动的会被关闭)。

4.1.1 启动浏览器

这种方式代码最简洁,程序会使用默认配置,自动生成页面对象。创建ChromiumPage对象时会在指定端口启动浏览器。默认情况下,程序使用 9222 端口。

from DrissionPage import ChromiumPage

page = ChromiumPage()

指定端口启动浏览器:

# 启动9333端口的浏览器,如该端口空闲,启动一个浏览器
page = ChromiumPage(9333)
4.1.2 接管浏览器

当页面对象创建时,只要指定的端口port已有浏览器在运行,就会直接接管。无论浏览器是哪种方式启动的。比如:先通过如下代码启动一个端口为8888的浏览器

from DrissionPage import ChromiumPage

page = ChromiumPage(666)

在启动的端口为8888的浏览器中,手动访问百度页面,然后使用如下程序测试是否可以接管该浏览器:

from DrissionPage import ChromiumPage

page = ChromiumPage(666)
#打印接管浏览器的page标题和访问的url
print(page.title,page.url)
4.1.3 多浏览器共存

如果想要同时操作多个浏览器,或者自己在使用其中一个上网,同时控制另外几个浏览器跑自动化,就需要给这些被程序控制的浏览器设置单独的端口用户文件夹,否则会造成冲突。

from DrissionPage import ChromiumPage, ChromiumOptions

# 创建多个配置对象,每个指定不同的端口号和用户文件夹路径
do1 = ChromiumOptions().set_paths(local_port=9111, user_data_path=r'D:\data1')
do2 = ChromiumOptions().set_paths(local_port=9222, user_data_path=r'D:\data2')

# 创建多个页面对象
page1 = ChromiumPage(addr_or_opts=do1)
page2 = ChromiumPage(addr_or_opts=do2)

# 每个页面对象控制一个浏览器
page1.get('https://www.baidu.com')
page2.get('http://www.163.com')

4.2 页面交互

  • get():该方法用于跳转到一个网址。当连接失败时,程序会进行重试。

    page.get('https://www.baidu.com')
    
  • back():此方法用于在浏览历史中后退若干步。

    page.back(2)  # 后退两个网页
    
  • forward():此方法用于在浏览历史中前进若干步。

    page.forward(2)  # 前进两步
    
  • refresh():此方法用于刷新当前页面。

    page.refresh()  # 刷新页面
    
  • run_js():此方法用于执行 js 脚本。

    # 用传入参数的方式执行 js 脚本显示弹出框显示 Hello world!
    #参数1:执行的js脚本。参数2:*args表示给js脚本传递的参数
    page.run_js('alert(arguments[0]+arguments[1]);', 'Hello', ' world!')
    
  • run_js_loaded():此方法用于运行 js 脚本,执行前等待页面加载完毕。

    page.run_js_loaded('alert(arguments[0]+arguments[1]);', 'Hello', ' world!')
    
  • scroll.to_bottom():此方法用于滚动页面到底部,水平位置不变。

    page.scroll.to_bottom()
    

4.3 查找元素

本节介绍 DrissionPage 自创的查找元素语法。
查找语法能用于指明以哪种方式去查找指定元素,定位语法简洁明了,熟练使用可大幅提高程序可读性。

🔦 更多页面或元素内查找:https://drissionpage.cn/browser_control/get_elements/find_in_object

以下使用这个页面进行讲解test.html(可以在pycharm中使用chrome打开该页面获取页面链接):

<html>
<body>
<div id="one">
    <p class="p_cls" id="row1" data="a">第一行</p>
    <p class="p_cls" id="row2" data="b">第二行</p>
    <p class="p_cls">第三行</p>
</div>
<div id="two">
    第二个div
</div>
</body>
</html>

基本定位语法:注意下面的ele和eles

page.ele:只能定位满足要求第一次出现的标签

page.eles:定位到满足要求所有的标签

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('http://localhost:63342/Code/test.html?_ijt=chuqtur5cikh95asobefg123mf')
#id属性定位
tag1 = page.ele('@id=one')  # 获取第一个id为one的元素

#文本定位
tag2 = page.ele('@text()=第一行')  # 获取第一个文本为“第一行”的元素

#当需要多个条件同时确定一个元素时,每个属性用'@@'开头。
tag3 = page.ele('@@class=p_cls@@text()=第三行')  # 查找class为p_cls且文本为“第三行”的元素

#当需要以或关系条件查找元素时,每个属性用'@|'开头。
tag4 = page.eles('@|id=row1@|id=row2')  # 查找所有id为row1或id为row2的元素

#表示模糊匹配,匹配含有指定字符串的文本或属性。
tag5 = page.eles('@id:ow')  # 获取id属性包含'ow'的元素

#表示匹配开头,匹配开头为指定字符串的文本或属性。
tag6 = page.eles('@id^row')  # 获取id属性以'row'开头的元素

#表示匹配结尾,匹配结尾为指定字符串的文本或属性。
tag7 = page.ele('@id$w1')  # 获取id属性以'w1'结尾的元素

print(tag7)

选择器定位语法

id选择器定位:

ele1 = page.ele('#one')  # 查找id为one的元素
ele2 = page.ele('#=one')  # 和上面一行一致
ele3 = page.ele('#:ne')  # 查找id属性包含ne的元素
ele4 = page.ele('#^on')  # 查找id属性以on开头的元素
ele5 = page.ele('#$ne')  # 查找id属性以ne结尾的元素

class选择器定位:

e1 = page.ele('.p_cls')  # 查找class属性为p_cls的元素
e2 = page.ele('.=p_cls')  # 与上一行一致
e3 = page.ele('.:_cls')  # 查找class属性包含_cls的元素
e4 = page.ele('.^p_')  # 查找class属性以p_开头的元素
e5 = page.ele('.$_cls')  # 查找class属性以_cls结尾的元素

文本选择器定位:

element1 = page.ele('text=第二行')  # 查找文本为“第二行”的元素
element2 = page.ele('text:第二')  # 查找文本包含“第二”的元素
element3 = page.ele('第二')  # 与上一行一致

标签选择器定位:

ele1 = page.ele('tag:div')  # 查找第一个div元素
ele2 = page.ele('tag:p@class=p_cls')  # 与单属性查找配合使用
ele3 = page.ele('tag:p@@class=p_cls@@text()=第二行')  # 与多属性查找配合使用

xpath定位:

eles = page.eles('xpath://div/p[@id="row1"]')

🚀查看更多语法:https://drissionpage.cn/browser_control/get_elements/sheet

4.4 获取元素信息的常用属性或方法

属性或方法说明
html此属性返回元素的 HTML 文本(不包括<iframe>内容)
inner_html此属性返回元素内部的 HTML 文本
tag此属性返回元素的标签名
text此属性返回元素内所有文本组合成的字符串
texts()此方法返回元素内所有直接子节点的文本(列表)
attrs此属性以字典形式返回元素所有属性及值
attr('attrName')此方法返回元素某个 attribute 属性值
link此方法返回元素的 href 属性或 src 属性
xpath此属性返回当前元素在页面中 xpath 的绝对路径

元素列表中批量获取信息

eles()等返回的元素列表,自带get属性,可用于获取指定信息。

from DrissionPage import SessionPage

page = SessionPage()
page.get('https://www.baidu.com')
eles = page.ele('#s-top-left').eles('t:a')
print(eles.get.texts())  # 获取所有元素的文本
print(eles.get.links())  # 获取所有元素的链接
print(eles.get.attrs("class"))  # 获取所有元素的指定属性值

五、🗺️SessionPage详解

顾名思义,SessionPage是一个使用Session(requests 库)对象的页面,且它还封装了网络连接和 html 解析功能,使收发数据包也可以像操作页面一样便利。
并且,由于加入了本库独创的查找元素方法,使数据的采集便利性远超 requests + beautifulsoup 等组合。

🚀了解更多:https://drissionpage.cn/SessionPage/intro
获取 gitee 推荐项目第一页所有项目。

# 导入
from DrissionPage import SessionPage
# 创建页面对象
page = SessionPage()
# 访问网页
page.get('https://gitee.com/explore/all')
# 在页面中查找元素
items = page.eles('tag:h3')
# 遍历元素
for item in items[:-1]:
    # 获取当前<h3>元素下的<a>元素
    lnk = item('tag:a')
    # 打印<a>元素文本和href属性
    print(lnk.text, lnk.link)

5.1 get请求

get()方法语法与 requests 的get()方法一致,在此基础上增加了连接失败重试功能。与 requests 不一样的是,它不返回Response对象,而是返回一个bool值,表示请求是否成功。

示例:请求51游戏指定关键字对应的搜索结果页面

from DrissionPage import SessionPage

page = SessionPage()
url = 'https://game.51.com/search/action/game/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
cookies = {'name': 'value'}
# proxies = {'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
param = {"q":'传奇'}
page.get(url, headers=headers, cookies=cookies,params=param,proxies=None)
print(page.html,page.title)

其他参数:

在这里插入图片描述

5.2 post请求

请求:中国人事考试网—站内搜索:http://www.cpta.com.cn/category/search.html

from DrissionPage import SessionPage

page = SessionPage()
url = 'http://www.cpta.com.cn/category/search'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
cookies = {'name': 'value'}
# proxies = {'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
data = {"keywords":'财务','搜索':'搜索'}
page.post(url, headers=headers, cookies=cookies,data=data,proxies=None)
print(page.html,page.title)

注意:在get和post请求中,headers中的User-Agent可以不写,因为SessionPage和WebPage在创建页面对象时会自动加载一个ini的配置文件,该配置文件中已经存在了User-Agent。

ini 文件初始内容如下:

......
[session_options]
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'connection': 'keep-alive', 'accept-charset': 'GB2312,utf-8;q=0.7,*;q=0.7'}

[timeouts]
base = 10
page_load = 30
script = 30

[proxies]
http =
https = 

[others]
retry_times = 3
retry_interval = 2

5.3 page对象常用属性

url:此属性返回当前访问的 url。
title:此属性返回当前页面title文本。
raw_data:此属性返回访问到的二进制数据,即Response对象的content属性。
html:此属性返回当前页面 html 文本。
json:此属性把返回内容解析成 json。比如请求接口时,若返回内容是 json 格式,用html属性获取的话会得到一个字符串,用此属性获取可将其解析成dict。

六、🗺️WebPage详解

WebPage覆盖了ChromiumPage所有功能,并且增加了切换模式功能,创建的标签页对象为MixTab。

from DrissionPage import WebPage

page = WebPage()

page.get('https://gitee.com/login')

# 定位到账号文本框,获取文本框元素
ele = page.ele('#user_login')

# 输入对文本框输入账号
ele.input('你的账号')

# 定位到密码文本框并输入密码
page.ele('#user_password').input('你的密码')

# 点击登录按钮
page.ele('@value=登 录').click()

"""
登录成功后,就可以进行相应的请求发送了
"""
# 模式切换 https://drissionpage.cn/get_start/examples/switch_mode
page.change_mode()

# 获取个人主页的推荐项目
self_page = 'https://gitee.com/muguilin'
page.get(self_page)

# 获取所有行元素
items = page.ele('#popular-pinned-projects').eles('.ui card fluid')
# 遍历获取到的元素
for item in items:
    # 打印元素文本
    # print(item('t:h3').text)
    print(item('.content').text)
    print()

扩展

⭐下载文件

DrissionPage 带一个简便易用的下载器,一行即可实现下载功能。

from DrissionPage import SessionPage

url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
save_path = r'C:\download'

page = SessionPage()
page.download(url, save_path)

🥬设置 cookies

🥦 设置 cookieshttps://drissionpage.cn/tutorials/functions/set_cookies
页面对象中设置

任意页面对象都有set.cookies()方法,用于设置 cookies。
该方法接收多种格式的 cookies 信息,可设置一个或多个 cookies。
使用浏览器时,任意页面对象设置的 cookies 是所有标签页共用的(由new_tab(new_context=True)创建的标签页除外)。

示例:

from DrissionPage import Chromium

tab = Chromium().latest_tab
cookies = 'name1=value1; name2=value2; path=/; domain=.example.com;'

tab.set.cookies(cookies)

删除 cookies
页面对象用set.cookies.remove()和set.cookies.clear()删除和清空 cookies。
SessionOptions对象用set_cookies(None)清空 cookies。
具体用法详见使用文档有关章节。

❓ 常见问题

❔ 如何禁用保存密码、恢复页面等提示气泡?
浏览器提示气泡出现时可以手动关闭,不关闭也不影响自动操作,在代码中阻止其显示也是可以的。 加一些浏览器配置代码即可禁止相应的气泡显示,需要添加下面这样的代码:

co = ChromiumOptions()

# 阻止“自动保存密码”的提示气泡
co.set_pref('credentials_enable_service', False)

# 阻止“要恢复页面吗?Chrome未正确关闭”的提示气泡
co.set_argument('--hide-crash-restore-bubble')

❔ 如何使用启动参数、用户配置、实验项等功能?
arguments 启动参数

  • 使用参考:http://DrissionPage.cn/ChromiumPage/browser_opt#-set_argument

  • 参数详见:https://peter.sh/experiments/chromium-command-line-switches/
    prefs 用户配置

  • 使用参考:http://DrissionPage.cn/ChromiumPage/browser_opt#-set_pref

  • 参数详见:https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc
    flags 实验项

  • 使用参考:http://DrissionPage.cn/ChromiumPage/browser_opt#-set_flag

  • 参数详见:chrome://flags

🚀更多常见问题https://drissionpage.cn/tutorials/QandA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java替换jar包中class文件

在更新java应用版本的运维工作中&#xff0c;由于一些原因&#xff0c;开发没办法给到完整的jar包&#xff0c;这个时候&#xff0c;就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件&#xff0c;重新启动服务即可&#xff1a; 1、将jar包和将要替换的cl…

AI Tokenization

AI Tokenization 人工智能分词初步了解 类似现在这个&#xff0c;一格子 一格子&#xff0c;拼接出来的&#xff0c;一行或者一句&#xff0c;像不像&#xff0c;我们人类思考的时候组装出来的话&#xff0c;并用嘴说出来了呢。

关于大数据的基础知识(四)——大数据的意义与趋势

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;四&a…

某视频的解密下载

下面讲一下怎么爬取视频&#xff0c;这个还是比小白的稍微有一点绕的 首先打开网址&#xff1a;aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首页 看一下&#xff1a; 有一个标题和一个href&#xff0c;href只是一个片段&#xff0c;待会肯定要拼接&#xff0c; 先找一…

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

从切图仔到鸿蒙开发01-文本样式

从切图仔到鸿蒙开发01-文本样式 本系列教程适合 HarmonyOS 初学者&#xff0c;为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 页面结构 HTML 与 ArkUI 在 Web 开发中&#xff0c;HTML 文档结…

菱形虚拟继承的原理

一 &#xff1a;菱形继承的问题 普通的菱形继承存在数据冗余和二义性的问题 &#xff0c;如下代码&#xff1a; class Person { public:string _name; //姓名 };class Student : public Person { protected:int _num; //学号 };class Teacher : public Person { protected:int…

【数据结构】C语言实现树和森林的遍历

C语言实现树和森林的遍历 导读一、树的遍历二、森林的遍历2.1 为什么森林没有后序遍历?2.2 森林中存不存在层序遍历?三、C语言实现3.1 准备工作3.2 数据结构的选择3.3 树与森林的创建3.4 树与森林的遍历3.4.1 先根遍历3.4.2 后根遍历3.4.3 森林的遍历3.5 树与森林的销毁3.6 算…

第四天 开始Unity Shader的学习之旅之Unity中的基础光照

Unity Shader的学习笔记 第四天 开始Unity Shader的学习之旅之Unity中的基础光照 文章目录 Unity Shader的学习笔记前言一、我们是如何看到这个世界的1. 光源2.吸收和散射3.着色 二、标准光照模型1. 自发光2. 高光反射① Phong模型② Blinn-Phong模型 3.漫反射4.环境光 总结 前…

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统模块功能结构图 局部E-R图 系统首…

Java-空链基础入门

经过调研和细致观察&#xff0c;我们发现空链对于初次接触或是对Stream和Optional不太熟悉的人来说&#xff0c;确实存在一定的上手难度&#xff0c;宛如开启了“地狱模式”。为了降低这一门槛&#xff0c;我们决定通过一系列由简入深的案例演示&#xff0c;来逐步引导大家掌握…

【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同&#xff0c;不同时区通过…

3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.17–3.23】Web3 游戏行业动态 Ronin 将与 Alpha Growth 等合作推出 1300 万美元增长计划&#xff0c;以向 DeFi 扩张Notcoin 开发工作室 Open Builders 宣布推出 Not Games …

AppInventor2生成3位数的水仙花数

生成3位水仙花数&#xff08;每位数字的立方之和刚好等于这个数字&#xff09;的代码&#xff0c;如下&#xff1a; 来源&#xff1a;【生成Python】AppInventor2中文网已支持代码块转换Python源码&#xff01; - App Inventor 2 中文网 - 清泛IT社区&#xff0c;为创新赋能&…

【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类

【聚类算法解析系列02】经典聚类算法&#xff08;上&#xff09;——K-Means与层次聚类 引言&#xff1a;算法背后的认知革命 K-Means与层次聚类&#xff0c;这两个诞生于1960年代的算法&#xff0c;至今仍是工业界使用率最高的聚类工具。它们分别代表了两种根本性的世界观&am…

[Effective C++]条款22:将成员变量声明为private

. 在C中&#xff0c;将成员变量声明为private而不是public&#xff0c;主要是为了遵循面向对象编程&#xff08;OOP&#xff09;的封装原则。他有助于隐藏对象的内部实现细节&#xff0c;提供更好地控制&#xff0c;安全性和可维护性。 1、数据隐藏与封装 将成员变量声明为pr…

心法利器[132] | 大模型系统性能优化trick

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2023年文章合集来袭&#xff0c;更…

六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 深入解析Vue3电商项目&#xff1a;TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…

类与对象(中)(详解)

【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…