Skip to content

🚤 标签页操作

本节介绍对浏览器标签页的管理及使用技巧。

与 selenium 不同,DrissionPage 能够用多个标签页对象同时操作多个标签页,而无须切入切出。并且,标签页无须在激活状态也可以控制。因此能够实现一些非常灵活的使用方式。

比如,多线程分别独立控制标签页,或一个总标签页,控制多个从标签页,或者配合插件实现浏览器随时更换代理等。

ChromiumPageWebPage对象为浏览器标签页总管,可以控制标签页的增删。ChromiumTabWebPageTab对象可从上两者中产生,为独立的标签页对象,可控制每个标签页内的操作。

事实上,ChromiumPageWebPage本身也指向一个标签页,它们也是标签页的一种,只是增加了管理浏览器窗口和下载功能。

知识点

ChromiumPageWebPage拥有所有 tab 控制的功能。 ChromiumTabWebPageTab则只有关闭自己的功能。

✅️️ 标签页总览

📌 tabs_count

此属性返回标签页数量。

类型:int

print(page.tabs_count)

输出:

2

📌 tabs

此属性以list方式返回所有标签页 id。

类型:List[str]

print(page.tabs)

输出:

['0B300BEA6F1F1F4D5DE406872B79B1AD', 'B838E91F38121B32940B47E8AC59D015']

📌 find_tabs()

此方法用于查找符合条件的 tab。

titleurltab_type三个参数是三个检索条件,它们是与的关系。

参数名称 类型 默认值 说明
title str None 匹配 title 包含此文本的 tab,为None时匹配所有
url str None 匹配 url 包含此文本的 tab,为None时匹配所有
tab_type str
list
tuple
set
None 匹配该类型的 tab,可输入多个,为None时匹配所有
single bool True True返回首个结果的 id,为False返回所有信息
返回类型 说明
str singleTrue时返回 tab id
List[dict] singleFalse时返回所有 tab 信息

示例:

查找 url 包含'baidu.com'的 tab 并创建对象:

from DrissionPage import ChromiumPage

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

tab_id = page.find_tabs(url='baidu.com')
print(tab_id)

输出:

'8460E5D55BCA5798AF83BC4D243652A9'

获取所有 tab 信息:

tabs = page.find_tabs(single=False)
print(tab)

输出:

[{'description': '',
  'devtoolsFrontendUrl': '/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/8460E5D55BCA5798AF83BC4D243652A9',
  'faviconUrl': 'https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg',
  'id': '8460E5D55BCA5798AF83BC4D243652A9',
  'title': '百度一下,你就知道',
  'type': 'page',
  'url': 'https://www.baidu.com/',
  'webSocketDebuggerUrl': 'ws://127.0.0.1:9222/devtools/page/8460E5D55BCA5798AF83BC4D243652A9'}]

✅️️ 新建标签页

📌 new_tab()

该方法用于新建一个标签页,该标签页在最后面。

参数名称 类型 默认值 说明
url str
None
None 新标签页访问的网址,不传入则新建空标签页
switch_to bool False 新建标签页后是否把焦点移过去
返回类型 说明
str 新标签页 id

示例:

page.new_tab(url='https://www.baidu.com')

✅️️ 关闭标签页

📌 close_tabs()

此方法用于关闭指定的标签页,可关闭多个。默认关闭当前的。

如果被关闭的标签页包含当前页,会切换到剩下的第一个页面,但未必是视觉上第一个。

参数名称 类型 默认值 说明
tabs_or_ids str
None
ChromiumTab
List[str, ChromiumTab]
Tuple[str, ChromiumTab]
None 要处理的标签页对象或 id,可传入列表或元组,为None时处理当前页
others bool True 是否关闭指定标签页之外的

返回:None

示例:

# 关闭当前标签页
page.close_tabs()

# 关闭第1、3个标签页
tabs = page.tabs
page.close_tabs(tabs_or_ids=(tabs[0], tabs[2]))

📌 close_other_tabs()

此方法用于关闭传入的标签页以外标签页,默认保留当前页。可传入多个。

如果被关闭的标签页包含当前页,会切换到剩下的第一个页面,但未必是视觉上第一个。

参数名称 类型 默认值 说明
tabs_or_ids str
None
ChromiumTab
List[str, ChromiumTab]
Tuple[str, ChromiumTab]
None 要处理的标签页对象或 id,可传入列表或元组,为None时处理当前页

返回:None

示例:

# 关闭除当前标签页外的所有标签页
page.close_other_tabs()

# 关闭除第一个以外的标签页
page.close_other_tabs(page.tab[0])

# 关闭除指定id以外的标签页
reserve_list = ('0B300BEA6F...', 'B838E91...')
page.close_other_tabs(reserve_list)

✅️️ 切换标签页

📌 main_tab

日常使用时,经常会用一个标签页作为主标签页,产生众多临时标签页去进行操作。因此我们可以为每个ChromiumPageWebPage对象设置一个标签页为主标签页,方便随时切换。

此属性返回主标签页的 id。

默认接管浏览器时活动标签页则为主标签页。

类型:str

示例:

print(page.main_tab)

输出:

'0B300BEA6F1F1F4D5DE406872B79B1AD'

📌 latest_tab

此属性返回最新的标签页。最新的标签页是指最新出现或最新被激活的标签页。

类型:str

示例:

# 打开了一个标签页
ele.click()
# 切换到最新打开的标签页
page.to_tab(page.latest_tab)

📌 set.main_tab()

此方法用于设置某个标签页为主标签页。

参数名称 类型 默认值 说明
tab_id str
None
None 要设置的标签页 id,默认设置当前标签页为主

返回:None

示例:

# 指定一个标签页为主标签页
page.set.main_tab(tab_id='0B300BEA6F1F1F4D5DE406872B79B1AD')

# 设置当前控制的标签页为主标签页
page.set.main_tab()

📌to_main_tab()

此方法用于把焦点定位到主标签页,使当前对象控制目标改为主标签页。

参数:

返回:None

示例:

page.to_main_tab()

📌 to_tab()

此方法把焦点定位到某个标签页,使当前对象控制目标改为该标签页。

参数名称 类型 默认值 说明
tab_or_id str
ChromiumTab
None
None 标签页对象或 id,默认为None切换到主标签页
activate bool True 切换后是否变为活动状态

返回:None

示例:

# 切换到主标签页
page.to_tab()

# 切换到第一个标签页
page.to_tab(page.tabs[0])

# 切换到id为该字符串的标签页
page.to_tab('0B300BEA6F1F1F4D5DE406872B79B1AD')

📌 set.tab_to_front()

此方法用于激活标签页使其处于最前面。但不会把当前对象焦点跳转到该标签页。

参数名称 类型 默认值 说明
tab_or_id str
ChromiumTab
None
None 标签页对象或 id,默认为None表示当前标签页

返回:None


✅️️ 多标签页协同

📌 获取标签页对象

可以用WebPageChromiumPageget_tab()方法获取标签页对象,然后可以使用这个对象对标签页进行操作。

🔸 get_tab()

参数名称 类型 默认值 说明
tab_id str
None
None 要获取的标签页 id,默认为None获取当前标签页
返回类型 说明
ChromiumTab 标签页对象

示例:

tab = page.get_tab()  # 获取当前标签页对象

📌 使用标签页对象

每个ChromiumTab对象控制一个浏览器标签页,方法和直接使用ChromiumPage一致,只比ChromiumPage少了控制标签页功能。

tab.get('https://www.baidu.com')  # 使用标签页对象

📌 控制多标签页协作示例

做自动化的时候,我们经常会遇到这样一种场景:我们有一个列表页,须要逐个点开里面的链接,获取新页面的内容,每个链接会打开一个新页面。

如果用 selenium 来做,点击一个链接后必须把焦点切换到新标签页,采集信息后再回到原来的页面,点击下一个链接,但由于焦点的切换,原来的元素信息已丢失,我们只能重新获取所有链接,以计数方式点击下一个,非常不优雅。

而用ChromiumPage,点开标签页后焦点无须移动,可直接生成一个新标签页的页面对象,对新页面进行采集,而原来列表页的对象可以继续操作下一个链接。甚至可以用多线程控制多个标签页,实现各种黑科技。

我们用 gitee 的推荐项目页面做个演示:最新推荐项目 - Gitee.com

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://gitee.com/explore/all')

links = page.eles('t:h3')
for link in links[:-1]:
    # 点击链接
    link.click()
    # 等待新标签页出现
    page.wait.new_tab()
    # 获取新标签页对象
    new_tab = page.get_tab(page.latest_tab)
    # 等待新标签页加载
    new_tab.wait.load_start()
    # 打印标签页标题
    print(new_tab.title)
    # 关闭除列表页外所有标签页
    page.close_other_tabs()

输出:

wx-calendar: 原生小程序日历组件(可滑动,可标记,可禁用)
thingspanel-go: 开源插件化物联网平台,Go语言开发。支持MQTT、Modbus多协议、多类型设备接入与可视化、自动化、告警、规则引擎等功能。 QQ群:371794256。
APITable: vika.cn维格表社区版,地表至强的开源低代码、多维表格工具,Airtable的开源免费替代。
ideaseg: 基于 NLP 技术实现的中文分词插件,准确度比常用的分词器高太多,同时提供 ElasticSearch  OpenSearch 插件。
vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑
ExDUIR.NET: Windows平台轻量DirectUI框架

后面省略。。。