page.new_tab
返回: FirefoxPage(新标签页的页面对象)page.new_tab(url=None)新建标签页,可选直接加载 URL。
参数说明
| 参数 | 说明 |
|---|---|
| url | 可选,新标签页要加载的地址。 |
常见坑
- 新标签页是独立对象,需要用返回值操作。
相关示例
标签页管理涵盖新建、切换、遍历和关闭。每个标签页是独立的 browsing context。
page.new_tab(url=None)新建标签页,可选直接加载 URL。
| 参数 | 说明 |
|---|---|
| url | 可选,新标签页要加载的地址。 |
page.tabs_count / page.tab_ids获取打开的标签页数量和 ID 列表。
page.get_tab(id_or_index)按 ID 或索引获取标签页对象。
| 参数 | 说明 |
|---|---|
| id_or_index | 标签页 ID 字符串或数字索引(从 1 开始)。 |
page.latest_tab获取最新打开的标签页对象。
page.close_other_tabs()关闭除当前标签页外的所有标签页。
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()展示 tab 作为日常页面操作的重要组织单位。
源码文件:app/content/ruyipage_examples/09_tabs.py · 仓库:09_tabs.py
# =============================
# 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()
系统覆盖 window 与 viewport 的浏览器级操作。
源码文件:app/content/ruyipage_examples/16_window_management.py · 仓库:16_window_management.py
# =============================
# 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()