全球动态代理 · 静态住宅代理 · 极高质量 · 包月不限量 · 学员低价 · 联系如意进行免费测试 · 欢迎公司及学员采购 · 另有任何海外数据采集需求,随时联系 · 商务合作微信:Charleval
Automation / 标签页
RuyiPage Docs

RuyiPage 标签页

标签页管理涵盖新建、切换、遍历和关闭。每个标签页是独立的 browsing context。

核心 API

page.new_tab

返回: FirefoxPage(新标签页的页面对象)
page.new_tab(url=None)

新建标签页,可选直接加载 URL。

参数说明
参数说明
url可选,新标签页要加载的地址。
常见坑
  • 新标签页是独立对象,需要用返回值操作。
相关示例

快速上手

python 多标签页操作
from ruyipage import launch

page = launch()
try:
    page.get("https://example.com")

    # 新建标签页
    tab2 = page.new_tab("https://httpbin.org/html")
    print(f"标签页数: {page.tabs_count}")

    # 遍历标签页
    for tid in page.tab_ids:
        tab = page.get_tab(tid)
        print(f"  {tab.title} - {tab.url}")

    # 获取最新标签页
    latest = page.latest_tab
    print(f"最新标签页: {latest.title}")

    # 关闭其他标签页
    page.close_other_tabs()
finally:
    page.quit()

相关示例源码

2 个示例 ▶ 点击展开

标签页管理:新建、切换、查找、关闭、后台激活

examples/09_tabs.py

展示 tab 作为日常页面操作的重要组织单位。

GitHub 仓库 查看仓库源码 page.new_tabpage.tabs_countpage.tab_idspage.get_tabpage.get_tabspage.latest_tabpage.close_other_tabspage.browser.activate_tab
  • 新建标签页并加载地址
  • 通过标题、索引等方式查找 tab
  • 获取所有标签页 ID
  • 激活后台标签页
  • 关闭单个标签或保留当前标签关闭其他标签
  • 观察 browsing context 树结构

源码文件:app/content/ruyipage_examples/09_tabs.py · 仓库:09_tabs.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: 标签页管理:新建、切换、查找、关闭、后台激活
# 说明: 展示 tab 作为日常页面操作的重要组织单位。
# 你会学到:
#   1. 新建标签页并加载地址
#   2. 通过标题、索引等方式查找 tab
#   3. 获取所有标签页 ID
#   4. 激活后台标签页
#   5. 关闭单个标签或保留当前标签关闭其他标签
# 相关 API: page.new_tab, page.tabs_count, page.tab_ids, page.get_tab, page.get_tabs, page.latest_tab, page.close_other_tabs, page.browser.activate_tab
# =============================

# -*- coding: utf-8 -*-
"""
示例9: 标签页管理
测试功能:
- 新建标签页
- 切换标签页
- 关闭标签页
- 获取标签页列表
- 标签页操作
"""

import os
import sys
import io

# 设置控制台输出编码为UTF-8(Windows兼容)
if sys.platform == "win32":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from ruyipage import FirefoxPage, FirefoxOptions


def test_tabs():
    """测试标签页管理功能"""
    print("=" * 60)
    print("测试9: 标签页管理")
    print("=" * 60)

    opts = FirefoxOptions()
    opts.headless(False)
    page = FirefoxPage(opts)

    try:
        # 加载测试页面
        test_page = os.path.join(
            os.path.dirname(__file__), "test_pages", "test_page.html"
        )
        test_url = "file:///" + os.path.abspath(test_page).replace("\\", "/")
        page.get(test_url)
        page.wait(1)

        # 1. 获取当前标签页数量
        print("\n1. 获取当前标签页数量:")
        print(f"   标签页数量: {page.tabs_count}")

        tab2_url = "data:text/html,<html><head><title>Example Tab</title></head><body>tab2</body></html>"
        tab3_url = "data:text/html,<html><head><title>Wikipedia Tab</title></head><body>tab3</body></html>"

        # 2. 新建标签页
        print("\n2. 新建标签页:")
        tab2 = page.new_tab(tab2_url)
        page.wait(2)
        print(f"   ✓ 新标签页已创建")
        print(f"   新标签页标题: {tab2.title}")
        print(f"   当前标签页数量: {page.tabs_count}")

        # 3. 再新建一个标签页
        print("\n3. 再新建一个标签页:")
        tab3 = page.new_tab(tab3_url)
        page.wait(2)
        print(f"   ✓ 第三个标签页已创建")
        print(f"   标签页标题: {tab3.title}")
        print(f"   当前标签页数量: {page.tabs_count}")

        # 4. 获取所有标签页ID
        print("\n4. 获取所有标签页ID:")
        tab_ids = page.tab_ids
        print(f"   标签页ID列表: {tab_ids}")

        print("   当前页面 tab_id: {}".format(page.tab_id))

        # 5. 通过序号获取标签页
        print("\n5. 通过序号获取标签页:")
        first_tab = page.get_tab(1)
        print(f"   第1个标签页标题: {first_tab.title}")

        second_tab = page.get_tab(2)
        print(f"   第2个标签页标题: {second_tab.title}")

        # 6. 切换到第一个标签页
        print("\n6. 切换到第一个标签页:")
        first_tab.get(test_url)
        page.wait(1)
        print(f"   当前标题: {first_tab.title}")

        # 7. 获取最新的标签页
        print("\n7. 获取最新的标签页:")
        latest = page.latest_tab
        print(f"   最新标签页标题: {latest.title}")

        # 8. 通过标题查找标签页
        print("\n8. 通过标题查找标签页:")
        example_tab = page.get_tab(title="Example")
        if example_tab:
            print(f"   找到标签页: {example_tab.title}")
        else:
            print(f"   未找到包含'Example'的标签页")

        # 9. 通过URL查找标签页
        print("\n9. 通过URL查找标签页:")
        wiki_tab = page.get_tab(title="Wikipedia")
        if wiki_tab:
            print(f"   找到标签页: {wiki_tab.title}")
        else:
            print(f"   未找到包含'wikipedia'的标签页")

        # 10. 获取所有匹配的标签页
        print("\n10. 获取所有标签页:")
        all_tabs = page.get_tabs()
        print(f"   共有 {len(all_tabs)} 个标签页")
        for i, tab in enumerate(all_tabs, 1):
            print(f"   标签页{i}: {tab.title[:50]}")

        # 10.1 获取窗口句柄信息
        print("\n10.1 获取客户端窗口信息:")
        window_handles = page.browser.window_handles
        print(f"   clientWindows 数量: {len(window_handles)}")
        if window_handles:
            first_window = window_handles[0]
            print(f"   首个窗口状态: {first_window.get('state')}")

        # 10.2 读取 browsing context 树
        print("\n10.2 获取 browsing context 树:")
        tree = page.contexts.get_tree()
        contexts = tree.contexts
        print(f"   顶层 context 数量: {len(contexts)}")
        if contexts:
            print(f"   第一个 context: {contexts[0].context}")

        # 11. 关闭一个标签页
        print("\n11. 关闭第二个标签页:")
        second_tab.close()
        page.wait(1)
        print(f"   ✓ 标签页已关闭")
        print(f"   剩余标签页数量: {page.tabs_count}")

        # 12. 关闭其他标签页(保留第一个)
        print("\n12. 关闭其他标签页:")
        page.close_other_tabs(first_tab)
        page.wait(1)
        print(f"   ✓ 其他标签页已关闭")
        print(f"   剩余标签页数量: {page.tabs_count}")

        # 13. 新建后台标签页
        print("\n13. 新建后台标签页:")
        bg_tab = page.new_tab(tab2_url, background=True)
        page.wait(1)
        print(f"   ✓ 后台标签页已创建")
        print(f"   当前标签页数量: {page.tabs_count}")

        # 14. 激活标签页
        print("\n14. 激活后台标签页:")
        page.browser.activate_tab(bg_tab)
        page.wait(1)
        print(f"   ✓ 标签页已激活")

        # 15. 通过高层 context API 创建后台标签页
        print("\n15. 通过高层context API创建后台标签页:")
        bidi_tab_id = page.contexts.create_tab(
            background=True,
            reference_context=page.tab_id,
        )
        page.wait(1)
        print(f"   高层新标签页ID: {bidi_tab_id}")
        print(f"   当前标签页数量: {page.tabs_count}")

        # 清理纯 BiDi 新建的标签页,避免影响退出顺序
        bidi_tab = page.get_tab(bidi_tab_id)
        if bidi_tab:
            bidi_tab.close()
            page.wait(1)
            print("   ✓ 纯BiDi标签页已关闭")

        print("\n" + "=" * 60)
        print("✓ 所有标签页管理测试通过!")
        print("=" * 60)

    except Exception as e:
        print(f"\n✗ 测试失败: {e}")
        import traceback

        traceback.print_exc()
    finally:
        page.wait(2)
        page.quit()


if __name__ == "__main__":
    test_tabs()

窗口管理:尺寸、位置、状态流与标签切换

examples/16_window_management.py

系统覆盖 window 与 viewport 的浏览器级操作。

GitHub 仓库 查看仓库源码 page.rect.window_sizepage.rect.viewport_sizepage.rect.window_locationpage.rect.page_sizepage.window.maximizepage.window.minimizepage.window.fullscreenpage.window.set_size
  • 读取窗口和视口尺寸
  • 调整窗口大小与位置
  • 切换最大化、最小化、全屏等状态
  • 多标签创建和激活切换

源码文件:app/content/ruyipage_examples/16_window_management.py · 仓库:16_window_management.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: 窗口管理:尺寸、位置、状态流与标签切换
# 说明: 系统覆盖 window 与 viewport 的浏览器级操作。
# 你会学到:
#   1. 读取窗口和视口尺寸
#   2. 调整窗口大小与位置
#   3. 切换最大化、最小化、全屏等状态
#   4. 多标签创建和激活切换
# 相关 API: page.rect.window_size, page.rect.viewport_size, page.rect.window_location, page.rect.page_size, page.window.maximize, page.window.minimize, page.window.fullscreen, page.window.set_size
# =============================

# -*- coding: utf-8 -*-
"""示例16: 浏览器窗口管理(完整场景)

测试覆盖:
1) 窗口/视口/页面尺寸与位置
2) 窗口状态流:normal -> maximize -> minimize -> fullscreen -> normal
3) 设置窗口大小、位置、居中
4) 多标签创建、激活、切换、关闭
"""

import os
import sys
import io

# 设置控制台输出编码为UTF-8(Windows兼容)
if sys.platform == "win32":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from ruyipage import FirefoxPage, FirefoxOptions


def test_window_management():
    """测试浏览器窗口管理功能"""
    print("=" * 60)
    print("测试16: 浏览器窗口管理")
    print("=" * 60)

    opts = FirefoxOptions()
    opts.headless(False)
    page = FirefoxPage(opts)

    try:
        # 加载测试页面
        test_page = os.path.join(
            os.path.dirname(__file__), "test_pages", "test_page.html"
        )
        test_url = "file:///" + os.path.abspath(test_page).replace("\\", "/")
        page.get(test_url)
        page.wait(1)

        # 1. 获取当前窗口大小
        print("\n1. 获取当前窗口大小:")
        size = page.rect.window_size
        print(f"   窗口大小: {size[0]} x {size[1]}")

        # 2. 获取视口大小
        print("\n2. 获取视口大小:")
        viewport = page.rect.viewport_size
        print(f"   视口大小: {viewport[0]} x {viewport[1]}")

        # 3. 获取窗口位置
        print("\n3. 获取窗口位置:")
        location = page.rect.window_location
        print(f"   窗口位置: ({location[0]}, {location[1]})")

        # 4. 获取页面完整大小
        print("\n4. 获取页面完整大小:")
        page_size = page.rect.page_size
        print(f"   页面大小: {page_size[0]} x {page_size[1]}")

        # 5. 获取滚动位置
        print("\n5. 获取滚动位置:")
        scroll_pos = page.rect.scroll_position
        print(f"   滚动位置: ({scroll_pos[0]}, {scroll_pos[1]})")

        # 6. 滚动页面并检查位置
        print("\n6. 滚动页面并检查位置:")
        page.scroll.to_bottom()
        page.wait(0.5)
        new_scroll = page.rect.scroll_position
        print(f"   滚动后位置: ({new_scroll[0]}, {new_scroll[1]})")

        # 6.1 窗口状态流
        print("\n6.1 窗口状态流测试:")
        page.window.maximize()
        page.wait(0.5)
        print(f"   maximize 后窗口大小: {page.rect.window_size}")

        page.window.minimize()
        page.wait(0.5)
        print("   ✓ minimize 已调用")

        page.window.fullscreen()
        page.wait(0.5)
        print(f"   fullscreen 后视口大小: {page.rect.viewport_size}")

        page.window.normal()
        page.wait(0.5)
        print("   ✓ normal 已恢复")

        # 6.2 设置窗口尺寸与位置并居中
        print("\n6.2 设置窗口尺寸/位置/居中:")
        page.window.set_size(1200, 820)
        page.window.set_position(40, 40)
        page.wait(0.5)
        print(f"   调整后窗口大小: {page.rect.window_size}")
        print(f"   调整后窗口位置: {page.rect.window_location}")

        page.window.center()
        page.wait(0.5)
        print(f"   居中后窗口位置: {page.rect.window_location}")

        # 7. 创建新标签页
        print("\n7. 创建新标签页:")
        new_tab = page.new_tab()
        page.wait(1)
        print(f"   ✓ 新标签页已创建")

        # 8. 在新标签页中打开页面
        print("\n8. 在新标签页中打开页面:")
        new_tab.get("https://www.example.com")
        new_tab.wait(2)
        print(f"   新标签页URL: {new_tab.url}")
        print(f"   新标签页标题: {new_tab.title}")

        # 9. 切换回原标签页
        print("\n9. 切换回原标签页:")
        # 使用 browser.activate_tab 显式切回原 tab
        page.browser.activate_tab(page.tab_id)
        page.wait(0.5)
        page.get(test_url)
        page.wait(0.5)
        print(f"   当前标签页标题: {page.title}")

        # 9.1 新建后台标签页并激活
        print("\n9.1 后台标签页激活测试:")
        bg_tab = page.new_tab("https://www.example.com", background=True)
        page.wait(1)
        print(f"   后台标签页ID: {bg_tab.tab_id}")
        page.browser.activate_tab(bg_tab)
        page.wait(1)
        print(f"   激活后标题: {bg_tab.title}")

        # 切回主 tab,避免后续关闭干扰
        page.browser.activate_tab(page.tab_id)
        page.wait(0.5)

        # 10. 关闭新标签页
        print("\n10. 关闭新标签页:")
        new_tab.close()
        try:
            bg_tab.close()
        except Exception:
            pass
        page.wait(0.5)
        print(f"   ✓ 新标签页已关闭")

        print("\n" + "=" * 60)
        print("✓ 所有窗口管理测试通过!")
        print("=" * 60)

    except Exception as e:
        print(f"\n✗ 测试失败: {e}")
        import traceback

        traceback.print_exc()
    finally:
        page.wait(2)
        page.quit()


if __name__ == "__main__":
    test_window_management()