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

243 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

本节介绍对浏览器标签页的管理及使用技巧。
与 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
后面省略。。。
```