page.prompts.set_auto
返回: Nonepage.prompts.set_auto(accept=True, text=None)设置弹窗自动处理策略。accept=True 自动接受,False 自动取消。
参数说明
| 参数 | 说明 |
|---|---|
| accept | True 自动接受 / False 自动取消。 |
| text | 可选,prompt 弹窗的自动填充文本。 |
常见坑
- 设置后对所有弹窗生效,需要差异化处理时用手动模式。
相关示例
弹窗处理模块覆盖 alert、confirm 和 prompt 三种浏览器原生对话框,支持自动应答和手动处理。
page.prompts.set_auto(accept=True, text=None)设置弹窗自动处理策略。accept=True 自动接受,False 自动取消。
| 参数 | 说明 |
|---|---|
| accept | True 自动接受 / False 自动取消。 |
| text | 可选,prompt 弹窗的自动填充文本。 |
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()专门讲 alert、confirm、prompt 及其自动策略。
源码文件:app/content/ruyipage_examples/17_user_prompts.py · 仓库:17_user_prompts.py
# =============================
# 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()
把 context 事件和 prompt 事件统一放到协议事件角度理解。
源码文件:app/content/ruyipage_examples/30_browsing_context_events.py · 仓库:30_browsing_context_events.py
#!/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()