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

RuyiPage 弹窗处理

弹窗处理模块覆盖 alert、confirm 和 prompt 三种浏览器原生对话框,支持自动应答和手动处理。

核心 API

page.prompts.set_auto

返回: None
page.prompts.set_auto(accept=True, text=None)

设置弹窗自动处理策略。accept=True 自动接受,False 自动取消。

参数说明
参数说明
acceptTrue 自动接受 / False 自动取消。
text可选,prompt 弹窗的自动填充文本。
常见坑
  • 设置后对所有弹窗生效,需要差异化处理时用手动模式。
相关示例

快速上手

python 处理 alert 和 confirm 弹窗
from ruyipage import launch

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

    # 自动接受所有弹窗
    page.prompts.set_auto(accept=True)

    # 触发 alert
    page.run_js("alert('hello')", as_expr=False)
    page.wait(1)

    # 触发 confirm 并自动接受
    result = page.run_js("confirm('确定删除?')")
    print(f"confirm 结果: {result}")  # True

    # prompt 弹窗自动填充
    page.prompts.set_auto(accept=True, text="自动填充内容")
    val = page.run_js("prompt('请输入名称')")
    print(f"prompt 返回: {val}")
finally:
    page.quit()

相关示例源码

2 个示例 ▶ 点击展开

用户提示框处理:自动策略与步骤式登录 API

examples/17_user_prompts.py

专门讲 alert、confirm、prompt 及其自动策略。

GitHub 仓库 查看仓库源码 opts.set_user_prompt_handlerpage.set_prompt_handlerpage.clear_prompt_handlerpage.get_last_prompt_openedpage.get_last_prompt_closedpage.prompt_login
  • 设置全局 alert / confirm / prompt 处理策略
  • 给 prompt 设置默认输入文本
  • 获取最近一次 prompt 打开和关闭信息
  • 使用步骤式 API 完成 prompt 登录

源码文件:app/content/ruyipage_examples/17_user_prompts.py · 仓库:17_user_prompts.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: 用户提示框处理:自动策略与步骤式登录 API
# 说明: 专门讲 alert、confirm、prompt 及其自动策略。
# 你会学到:
#   1. 设置全局 alert / confirm / prompt 处理策略
#   2. 给 prompt 设置默认输入文本
#   3. 获取最近一次 prompt 打开和关闭信息
#   4. 使用步骤式 API 完成 prompt 登录
# 相关 API: opts.set_user_prompt_handler, page.set_prompt_handler, page.clear_prompt_handler, page.get_last_prompt_opened, page.get_last_prompt_closed, page.prompt_login
# =============================

# -*- coding: utf-8 -*-
"""示例17: 用户提示框处理(登录式步骤 API)

演示:
1) 自动策略 API
2) 步骤式 prompt 登录 API
3) 触发模式切换:mouse / keyboard
"""

import io
import os
import sys


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 FirefoxOptions, FirefoxPage


def test_user_prompts():
    print("=" * 60)
    print("测试17: 用户提示框处理")
    print("=" * 60)

    opts = FirefoxOptions()
    opts.headless(False)
    opts.set_user_prompt_handler(
        {
            "alert": "accept",
            "confirm": "accept",
            "prompt": "ignore",
            "default": "accept",
        }
    )
    page = FirefoxPage(opts)

    try:
        test_page = os.path.join(
            os.path.dirname(__file__), "test_pages", "native_user_prompts_test.html"
        )
        test_url = "file:///" + os.path.abspath(test_page).replace("\\", "/")
        page.get(test_url)
        page.wait(0.8)

        page.set_prompt_handler(
            alert="accept",
            confirm="accept",
            prompt="ignore",
            default="accept",
            prompt_text="张三",
        )

        print("\n1. alert(自动策略):")
        page.ele("#alert-btn").click_self()
        page.wait(0.3)
        print(f"   result: {page.ele('#alert-result').text}")

        print("\n2. confirm(自动策略):")
        page.ele("#confirm-btn").click_self()
        page.wait(0.3)
        print(f"   result: {page.ele('#confirm-result').text}")
        print(f"   opened: {page.get_last_prompt_opened()}")
        print(f"   closed: {page.get_last_prompt_closed()}")

        print("\n3. prompt 登录(步骤式 API / mouse):")
        page.clear_prompt_handler()
        page.get(test_url)
        page.wait(0.8)
        page.prompt_login(
            "#login-prompt-btn", "alice", "s3cr3t", trigger="mouse", timeout=2
        )
        page.wait(0.5)
        print(f"   result: {page.ele('#prompt-result').text}")

        print("\n4. prompt 登录(步骤式 API / keyboard):")
        page.get(test_url)
        page.wait(0.8)
        page.prompt_login(
            "#login-prompt-btn", "bob", "654321", trigger="keyboard", timeout=2
        )
        page.wait(0.5)
        print(f"   result: {page.ele('#prompt-result').text}")

        print("\n" + "=" * 60)
        print("✓ 用户提示框自动策略 + 登录式步骤 API 测试完成!")
        print("=" * 60)

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

        traceback.print_exc()
    finally:
        try:
            page.clear_prompt_handler()
        except Exception:
            pass
        page.wait(1)
        page.quit()


if __name__ == "__main__":
    test_user_prompts()

BrowsingContext 事件:上下文创建销毁与用户提示框事件

examples/30_browsing_context_events.py

把 context 事件和 prompt 事件统一放到协议事件角度理解。

GitHub 仓库 查看仓库源码 page.events.startpage.events.waitpage.contexts.create_tabpage.contexts.create_windowpage.contexts.closepage.accept_promptpage.set_prompt_handler
  • 监听 tab 和 window 创建销毁
  • 监听 alert 和 prompt 打开关闭
  • 配合自动 prompt 策略处理事件链

源码文件:app/content/ruyipage_examples/30_browsing_context_events.py · 仓库:30_browsing_context_events.py

python 注释版
#!/usr/bin/env python
# =============================
# RuyiPage 示例注释版
# 标题: BrowsingContext 事件:上下文创建销毁与用户提示框事件
# 说明: 把 context 事件和 prompt 事件统一放到协议事件角度理解。
# 你会学到:
#   1. 监听 tab 和 window 创建销毁
#   2. 监听 alert 和 prompt 打开关闭
#   3. 配合自动 prompt 策略处理事件链
# 相关 API: page.events.start, page.events.wait, page.contexts.create_tab, page.contexts.create_window, page.contexts.close, page.accept_prompt, page.set_prompt_handler
# =============================

# -*- coding: utf-8 -*-
"""示例30: BrowsingContext Events(严格结果版)"""

import io
import sys
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 BidiEvent, 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("测试 30: BrowsingContext Events")
    print("=" * 70)

    page = FirefoxPage()
    results: List[Dict[str, str]] = []
    temp_tab = None
    temp_window = None

    try:
        page.get("https://www.example.com")
        add_result(results, "页面加载", "成功", "example.com 已加载")

        if page.events.start(
            [
                "browsingContext.contextCreated",
                "browsingContext.contextDestroyed",
                "browsingContext.userPromptOpened",
                "browsingContext.userPromptClosed",
            ],
            contexts=[],
        ):
            add_result(results, "事件订阅", "成功", "已订阅 context / prompt 相关事件")
        else:
            add_result(results, "事件订阅", "失败", "未能订阅 browsingContext 事件")
            print_results(results)
            return

        # 1. contextCreated / contextDestroyed
        page.events.clear()
        temp_tab = page.contexts.create_tab()
        created_tab: BidiEvent | None = page.events.wait(
            "browsingContext.contextCreated", timeout=3
        )
        if created_tab and created_tab.context == temp_tab:
            add_result(
                results,
                "browsingContext.contextCreated tab",
                "成功",
                f"context={temp_tab}",
            )
        else:
            add_result(
                results,
                "browsingContext.contextCreated tab",
                "失败",
                f"expected={temp_tab}",
            )

        temp_window = page.contexts.create_window()
        created_window: BidiEvent | None = page.events.wait(
            "browsingContext.contextCreated", timeout=3
        )
        if created_window and created_window.context == temp_window:
            add_result(
                results,
                "browsingContext.contextCreated window",
                "成功",
                f"context={temp_window}",
            )
        else:
            add_result(
                results,
                "browsingContext.contextCreated window",
                "失败",
                f"expected={temp_window}",
            )

        if temp_tab:
            page.contexts.close(temp_tab)
            destroyed_tab = page.events.wait(
                "browsingContext.contextDestroyed", timeout=3
            )
            if destroyed_tab and destroyed_tab.context == temp_tab:
                add_result(
                    results,
                    "browsingContext.contextDestroyed tab",
                    "成功",
                    f"context={temp_tab}",
                )
            else:
                add_result(
                    results,
                    "browsingContext.contextDestroyed tab",
                    "失败",
                    f"expected={temp_tab}",
                )
            temp_tab = None

        if temp_window:
            page.contexts.close(temp_window)
            destroyed_window = page.events.wait(
                "browsingContext.contextDestroyed", timeout=3
            )
            if destroyed_window and destroyed_window.context == temp_window:
                add_result(
                    results,
                    "browsingContext.contextDestroyed window",
                    "成功",
                    f"context={temp_window}",
                )
            else:
                add_result(
                    results,
                    "browsingContext.contextDestroyed window",
                    "失败",
                    f"expected={temp_window}",
                )
            temp_window = None

        # 2. userPromptOpened / userPromptClosed
        page.events.clear()

        page.run_js("alert('hello alert')", as_expr=False)
        opened_alert = page.events.wait("browsingContext.userPromptOpened", timeout=3)
        if opened_alert and opened_alert.user_prompt_type == "alert":
            add_result(
                results,
                "browsingContext.userPromptOpened alert",
                "成功",
                opened_alert.message or "",
            )
        else:
            add_result(
                results,
                "browsingContext.userPromptOpened alert",
                "失败",
                "未观察到 alert 打开事件",
            )

        page.accept_prompt(timeout=3)
        closed_alert = page.events.wait("browsingContext.userPromptClosed", timeout=3)
        if closed_alert and closed_alert.accepted is True:
            add_result(
                results,
                "browsingContext.userPromptClosed alert",
                "成功",
                f"accepted={closed_alert.accepted}",
            )
        else:
            add_result(
                results,
                "browsingContext.userPromptClosed alert",
                "失败",
                "未观察到 alert 关闭事件",
            )

        page.events.clear()
        page.set_prompt_handler(prompt="ignore", prompt_text="Test User")

        page.run_js("prompt('Enter your name:', 'default')", as_expr=False)
        opened_prompt = page.events.wait("browsingContext.userPromptOpened", timeout=3)
        if opened_prompt and opened_prompt.user_prompt_type == "prompt":
            add_result(
                results,
                "browsingContext.userPromptOpened prompt",
                "成功",
                opened_prompt.message or "",
            )
        else:
            add_result(
                results,
                "browsingContext.userPromptOpened prompt",
                "失败",
                "未观察到 prompt 打开事件",
            )

        closed_prompt = page.events.wait("browsingContext.userPromptClosed", timeout=3)
        if closed_prompt and closed_prompt.accepted is True:
            add_result(
                results,
                "browsingContext.userPromptClosed prompt",
                "成功",
                f"accepted={closed_prompt.accepted}",
            )
        else:
            add_result(
                results,
                "browsingContext.userPromptClosed prompt",
                "跳过",
                "当前环境下 prompt 自动注入文本后未稳定观察到 userPromptClosed",
            )

        page.clear_prompt_handler()
        print_results(results)

    except Exception as e:
        add_result(results, "示例执行", "失败", str(e)[:120])
        print_results(results)
        raise
    finally:
        try:
            page.clear_prompt_handler()
        except Exception:
            pass
        try:
            page.events.stop()
        except Exception:
            pass
        if temp_tab:
            try:
                page.contexts.close(temp_tab)
            except Exception:
                pass
        if temp_window:
            try:
                page.contexts.close(temp_window)
            except Exception:
                pass
        try:
            page.quit()
        except Exception:
            pass


if __name__ == "__main__":
    main()