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

RuyiPage 窗口

窗口模块控制浏览器窗口的大小、位置和状态(最大化/最小化/全屏/居中)。

核心 API

page.window.set_size

返回: None
page.window.set_size(width, height)

设置窗口尺寸。

参数说明
参数说明
width窗口宽度(像素)。
height窗口高度(像素)。
常见坑
  • 最大化状态下需先恢复正常再调大小。
相关示例

快速上手

python 窗口控制
from ruyipage import launch

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

    # 设置窗口大小
    page.window.set_size(1280, 720)
    print(f"窗口尺寸: {page.rect.window_size}")

    # 居中显示
    page.window.center()
    print(f"窗口位置: {page.rect.window_location}")

    # 最大化
    page.window.maximize()
finally:
    page.quit()

相关示例源码

2 个示例 ▶ 点击展开

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

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

Browser 模块:用户上下文与客户端窗口

examples/25_browser_user_context.py

Browser 模块最完整的 user context 与 client window 说明案例。

GitHub 仓库 查看仓库源码 page.browser_tools.get_user_contextspage.browser_tools.create_user_contextpage.browser_tools.remove_user_contextpage.browser_tools.create_tabpage.browser_tools.get_client_windowspage.browser_tools.set_window_state
  • 读取 user context 列表
  • 创建与删除 user context
  • 在指定 user context 中创建新 tab
  • 读取 client window 列表
  • 切换窗口状态为 minimized / maximized / fullscreen

源码文件:app/content/ruyipage_examples/25_browser_user_context.py · 仓库:25_browser_user_context.py

python 注释版
#!/usr/bin/env python
# =============================
# RuyiPage 示例注释版
# 标题: Browser 模块:用户上下文与客户端窗口
# 说明: Browser 模块最完整的 user context 与 client window 说明案例。
# 你会学到:
#   1. 读取 user context 列表
#   2. 创建与删除 user context
#   3. 在指定 user context 中创建新 tab
#   4. 读取 client window 列表
#   5. 切换窗口状态为 minimized / maximized / fullscreen
# 相关 API: page.browser_tools.get_user_contexts, page.browser_tools.create_user_context, page.browser_tools.remove_user_context, page.browser_tools.create_tab, page.browser_tools.get_client_windows, page.browser_tools.set_window_state
# =============================

# -*- coding: utf-8 -*-
"""示例25: Browser 模块(用户上下文 + 客户端窗口)严格结果版"""

import io
import sys
import time
from typing import Dict, List

if sys.platform == "win32":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")

from ruyipage import FirefoxPage


def add_result(
    results: List[Dict[str, str]], item: str, status: str, note: str
) -> None:
    """记录结构化结果。"""
    results.append({"item": item, "status": status, "note": note})


def print_results(results: List[Dict[str, str]]) -> None:
    """打印固定格式结果表。"""
    print("\n| 项目 | 状态 | 说明 |")
    print("| --- | --- | --- |")
    for row in results:
        print(f"| {row['item']} | {row['status']} | {row['note']} |")


def main() -> None:
    print("=" * 70)
    print("测试 25: Browser 用户上下文与窗口管理")
    print("=" * 70)

    page = FirefoxPage()
    results: List[Dict[str, str]] = []
    user_context_id = None
    new_tab_ctx = None

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

        # 1. user context 生命周期
        before = page.browser_tools.get_user_contexts()
        before_ids = [i.get("userContext") for i in before]
        add_result(
            results,
            "browser.getUserContexts before",
            "成功",
            f"创建前数量: {len(before)}",
        )

        user_context_id = page.browser_tools.create_user_context()
        if user_context_id:
            add_result(
                results,
                "browser.createUserContext",
                "成功",
                f"userContext={user_context_id}",
            )
        else:
            add_result(
                results, "browser.createUserContext", "失败", "未返回 userContext ID"
            )

        after_create = page.browser_tools.get_user_contexts()
        after_create_ids = [i.get("userContext") for i in after_create]
        if user_context_id in after_create_ids and len(after_create) == len(before) + 1:
            add_result(
                results,
                "browser.getUserContexts after create",
                "成功",
                f"数量变为 {len(after_create)}",
            )
        else:
            add_result(
                results,
                "browser.getUserContexts after create",
                "失败",
                "创建后数量或ID校验不通过",
            )

        if user_context_id:
            new_tab_ctx = page.browser_tools.create_tab(user_context=user_context_id)
            if new_tab_ctx:
                add_result(
                    results,
                    "browsingContext.create tab in user context",
                    "成功",
                    f"context={new_tab_ctx}",
                )
            else:
                add_result(
                    results,
                    "browsingContext.create tab in user context",
                    "失败",
                    "未返回新 tab context",
                )

        if new_tab_ctx:
            try:
                page.contexts.close(new_tab_ctx)
                add_result(
                    results, "browsingContext.close new tab", "成功", "新 tab 已关闭"
                )
                new_tab_ctx = None
            except Exception as e:
                add_result(
                    results, "browsingContext.close new tab", "跳过", str(e)[:120]
                )

        if user_context_id:
            page.browser_tools.remove_user_context(user_context_id)
            add_result(
                results,
                "browser.removeUserContext",
                "成功",
                f"已删除 {user_context_id}",
            )

            after_remove = page.browser_tools.get_user_contexts()
            after_remove_ids = [i.get("userContext") for i in after_remove]
            if user_context_id not in after_remove_ids and len(after_remove) == len(
                before_ids
            ):
                add_result(
                    results,
                    "browser.getUserContexts after remove",
                    "成功",
                    f"数量回到 {len(after_remove)}",
                )
            else:
                add_result(
                    results,
                    "browser.getUserContexts after remove",
                    "失败",
                    "删除后数量或ID校验不通过",
                )
            user_context_id = None

        # 2. client window 状态流
        windows = page.browser_tools.get_client_windows()
        if not windows:
            add_result(
                results, "browser.getClientWindows", "失败", "未返回任何 client window"
            )
        else:
            add_result(
                results, "browser.getClientWindows", "成功", f"窗口数量: {len(windows)}"
            )
            win = windows[0]
            win_id = win.get("clientWindow")
            states = ["minimized", "normal", "maximized", "fullscreen", "normal"]
            state_notes = []
            state_failed = False
            for state in states:
                page.browser_tools.set_window_state(win_id, state=state)
                time.sleep(0.4)
                current_windows = page.browser_tools.get_client_windows()
                current = current_windows[0] if current_windows else {}
                current_state = current.get("state")
                state_notes.append(f"{state}->{current_state}")
                if current_state != state:
                    state_failed = True

            if state_failed:
                add_result(
                    results,
                    "browser.setClientWindowState",
                    "失败",
                    ", ".join(state_notes),
                )
            else:
                add_result(
                    results,
                    "browser.setClientWindowState",
                    "成功",
                    ", ".join(state_notes),
                )

        print_results(results)

    except Exception as e:
        add_result(results, "示例执行", "失败", str(e)[:120])
        print_results(results)
        raise
    finally:
        if new_tab_ctx:
            try:
                page.contexts.close(new_tab_ctx)
            except Exception:
                pass
        if user_context_id:
            try:
                page.browser_tools.remove_user_context(user_context_id)
            except Exception:
                pass
        try:
            page.quit()
        except Exception:
            pass


if __name__ == "__main__":
    main()