本节介绍对浏览器标签页的管理及使用技巧。 与 selenium 不同,`WebPage`能够用多个标签页对象同时操作多个标签页,而无须切入切出,并且,标签页无须在激活状态也可以控制。因此能够实现一些非常灵活的使用方式。 比如多线程分别独立控制标签页,或一个总标签页,控制多个从标签页,或者配合插件实现浏览器随时更换代理等。 `WebPage`或`ChromiumPage`对象为浏览器标签页总管,可以控制标签页的增删。`ChromiumTab`对象为独立的标签页对象,可控制每个标签页内的操作。 # ✔️ 标签页总览 ## 📍 `tabs_count` 此属性返回标签页数量。 ```python print(page.tabs_count) # 输出:2 ``` ## 📍 `tabs` 此属性以`list`方式返回所有标签页 id。 ```python print(page.tabs) # 输出:['0B300BEA6F1F1F4D5DE406872B79B1AD', 'B838E91F38121B32940B47E8AC59D015'] ``` # ✔️ 新建标签页 ## 📍 `new_tab()` 该方法用于新建一个标签页,该标签页在最后面。 **参数:** - `url`:新标签页跳转到的网址,不传入则新建空标签页 - `switch_to`:新建标签页后是否把焦点移过去,默认为跳转 **返回:**`None` ```python page.new_tab(url='https://www.baidu.com') ``` # ✔️ 关闭标签页 ## 📍 `close_tabs()` 此方法用于关闭指定的标签页,可关闭多个。默认关闭当前的。 如果被关闭的标签页包含当前页,会跳转到剩下的第一个页面,但未必是视觉上第一个。 **参数:** - `tab_ids`:要关闭的标签页 id,可传入 id 组成的列表或元组,为`None`时关闭当前页 - `others`:是否关闭指定标签页之外的 返回:`None` ```python # 关闭当前标签页 page.close_tabs() # 关闭第1、3个标签页 tabs = page.tabs page.close_tabs(tab_ids=(tabs[0], tabs[2])) ``` ## 📍 `close_other_tabs()` 此方法用于关闭传入的标签页以外标签页,默认保留当前页。可传入多个。 如果被关闭的标签页包含当前页,会跳转到剩下的第一个页面,但未必是视觉上第一个。 **参数:** - `tab_ids`:要保留的标签页 id,可传入 id 组成的列表或元组,为`None`时保存当前页 **返回:**`None` ```python # 关闭除当前标签页外的所有标签页 page.close_other_tabs() # 关闭除第一个以外的标签页 page.close_other_tabs(page.tab[0]) # 关闭除 id 为 aaaaa 和 bbbbb 以外的标签页 reserve_list = ('aaaaa', 'bbbbb') page.close_other_tabs(reserve_list) ``` # ✔️ 切换标签页 ## 📍 `main_tab` 日常使用时,经常会用一个标签页作为主标签页,产生众多临时标签页去进行操作。因此我们可以为每个`WebPage`或`ChromiumPage`对象设置一个标签页为主标签页,方便随时切换。 默认接管浏览器时活动标签页则为主标签页。 ```python print(page.main_tab) # 输出:'0B300BEA6F1F1F4D5DE406872B79B1AD' ``` ## 📍 `set_main_tab()` 此方法用于设置某个标签页为主标签页。 **参数:** - `tab_id`:要设置的标签页 id,不传入则设置当前标签页为主 **返回:**`None` ```python # 指定一个标签页为主标签页 page.set_main_tab(tab_id='0B300BEA6F1F1F4D5DE406872B79B1AD') # 设置当前控制的标签页为主标签页 ``` ## 📍`to_main_tab()` 此方法用于把焦点定位到主标签页,使当前对象控制目标改为主标签页。 ```python page.to_main_tab() ``` ## 📍 `to_tab()` 此方法把焦点定位到某个标签页,使当前对象控制目标改为该标签页。 **参数:** - `tab_id`:标签页 id,默认切换到主标签页 - `activate`:切换后是否变为活动状态 **返回:**`None` ```python # 跳转到主标签页 page.to_tab() # 跳转到第一个标签页 page.to_tab(page.tabs[0]) # 跳转到 id 为该字符串的标签页 page.to_tab('0B300BEA6F1F1F4D5DE406872B79B1AD') ``` ## 📍 `to_front()` 此方法用于激活当前标签页使其处于最前面。标签页无须在活动状态程序也能操控。 **参数:** 无 **返回:**`None` # ✔️ 多标签页协同 ## 📍 获取标签页对象 可以用`WebPage`或`ChromiumPage`的`get_tab()`方法获取标签页对象,然后可以使用这个对象对标签页进行操作。 `get_tab()` **参数:** - `tab_id`:要获取的标签页 id,为`None`时获取当前标签页 **返回:**`ChromiumTab`对象 ```python tab = page.get_tab() # 获取当前标签页对象 ``` ## 📍 使用标签页对象 每个`ChromiumTab`对象控制一个浏览器标签页,方法和直接使用`ChromiumPage`一致,只比`ChromiumPage`少了控制标签页功能。 ```python tab.get('https://www.baidu.com') # 使用标签页对象 ``` ## 📍 同时控制多标签页示例 下面的例子演示多个线程控制多个标签页进行内容采集。 ```python from threading import Thread from DrissionPage import ChromiumPage def 采集(tab): # 采集 4 页 for _ in range(4): # 获取某页所有库名称并打印 for i in tab.eles('.title project-namespace-path'): print(i.text) # 点击翻页 tab('@rel=next').click() # 等待页面进入加载 tab.wait_loading() if __name__ == '__main__': # 新建页面对象 page = ChromiumPage() # 第一个标签页访问网址 page.get('https://gitee.com/explore/ai') # 获取第一个标签页对象 tab1 = page.get_tab() # 新建一个标签页并访问另一个网址 page.new_tab('https://gitee.com/explore/machine-learning') # 获取第二个标签页对象 tab2 = page.get_tab() # 多线程同时处理多个页面 Thread(target=采集, args=(tab1,)).start() Thread(target=采集, args=(tab2,)).start() ``` 输出: ```console MindSpore/mindspore PaddlePaddle/Paddle MindSpore/docs scruel/Notes-ML-AndrewNg MindSpore/graphengine inspur-inna/inna1.0 MindSpore/course MindSpore/community 后面省略。。。 ```