DrissionPage/docs/WebPage使用方法/3.8标签页操作.md

5.9 KiB
Raw Blame History

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

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

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

WebPageChromiumPage对象为浏览器标签页总管,可以控制标签页的增删。ChromiumTab对象为独立的标签页对象,可控制每个标签页内的操作。

✔️ 标签页总览

📍 tabs_count

此属性返回标签页数量。

print(page.tabs_count)
# 输出2

📍 tabs

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

print(page.tabs)
# 输出:['0B300BEA6F1F1F4D5DE406872B79B1AD', 'B838E91F38121B32940B47E8AC59D015']

✔️ 新建标签页

📍 new_tab()

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

参数:

  • url:新标签页跳转到的网址,不传入则新建空标签页

  • switch_to:新建标签页后是否把焦点移过去,默认为跳转

返回:None

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

✔️ 关闭标签页

📍 close_tabs()

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

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

参数:

  • tab_ids:要关闭的标签页 id可传入 id 组成的列表或元组,为None时关闭当前页
  • others:是否关闭指定标签页之外的

返回:None

# 关闭当前标签页
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

# 关闭除当前标签页外的所有标签页
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

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

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

print(page.main_tab)
# 输出:'0B300BEA6F1F1F4D5DE406872B79B1AD'

📍 set_main_tab()

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

参数:

  • tab_id:要设置的标签页 id不传入则设置当前标签页为主

返回:None

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

# 设置当前控制的标签页为主标签页

📍to_main_tab()

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

page.to_main_tab()

📍 to_tab()

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

参数:

  • tab_id:标签页 id默认切换到主标签页
  • activate:切换后是否变为活动状态

返回:None

# 跳转到主标签页
page.to_tab()

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

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

📍 to_front()

此方法用于激活当前标签页使其处于最前面。标签页无须在活动状态程序也能操控。

参数:

返回:None

✔️ 多标签页协同

📍 获取标签页对象

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

get_tab()

参数:

  • tab_id:要获取的标签页 idNone时获取当前标签页

返回:ChromiumTab对象

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

📍 使用标签页对象

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

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

📍 同时控制多标签页示例

下面的例子演示多个线程控制多个标签页进行内容采集。

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()

输出:

MindSpore/mindspore
PaddlePaddle/Paddle
MindSpore/docs
scruel/Notes-ML-AndrewNg
MindSpore/graphengine
inspur-inna/inna1.0
MindSpore/course
MindSpore/community

后面省略。。。