page.get
返回: Nonepage.get(url, wait='complete')导航到指定 URL。wait 参数控制加载等待策略。
参数说明
| 参数 | 说明 |
|---|---|
| url | 目标页面地址。 |
| wait | 'complete'(默认, 等 readyState)/ 'interactive' / 'none'。 |
常见坑
- 部分 SPA 页面 readyState 始终是 complete,需要额外等待元素。
相关示例
页面导航是自动化的基础操作。掌握 get/back/forward/refresh 和等待策略,脚本的页面跳转就不会出问题。
page.get(url, wait='complete')导航到指定 URL。wait 参数控制加载等待策略。
| 参数 | 说明 |
|---|---|
| url | 目标页面地址。 |
| wait | 'complete'(默认, 等 readyState)/ 'interactive' / 'none'。 |
page.back() / page.forward()浏览器历史前进/后退。等同于点击浏览器的前进/后退按钮。
page.refresh()刷新当前页面。
page.url / page.title获取当前页面的 URL 和标题。
from ruyipage import launch
page = launch()
try:
# 访问页面
page.get("https://example.com")
print(f"页面1: {page.title}")
# 跳转到第二个页面
page.get("https://httpbin.org/html")
print(f"页面2: {page.title}")
# 后退
page.back()
print(f"后退到: {page.url}")
# 前进
page.forward()
print(f"前进到: {page.url}")
# 刷新
page.refresh()
print(f"刷新后: {page.title}")
finally:
page.quit()| 值 | 等什么 | 适合场景 |
|---|---|---|
| 'complete'(默认) | 等待 readyState == complete | 大多数普通页面 |
| 'interactive' | 等待 DOM 解析完成,不等资源 | 只需要 DOM 的场景 |
| 'none' | 不等,立即返回 | 配合自己的等待逻辑 |
覆盖最基础的页面访问、前进后退和保存 HTML/PDF。
源码文件:app/content/ruyipage_examples/01_basic_navigation.py · 仓库:01_basic_navigation.py
# =============================
# RuyiPage 示例注释版
# 标题: 基础导航与页面保存
# 说明: 覆盖最基础的页面访问、前进后退和保存 HTML/PDF。
# 你会学到:
# 1. 打开本地文件页面和外部页面
# 2. 读取标题、URL 和 HTML 源码
# 3. 执行前进、后退和刷新
# 4. 保存 HTML 与 PDF
# 相关 API: FirefoxPage, FirefoxOptions, page.get, page.title, page.url, page.html, page.back, page.forward
# =============================
# -*- coding: utf-8 -*-
"""
示例1: 基础导航和页面操作
测试功能:
- 创建浏览器实例
- 页面导航
- 获取标题、URL
- 前进、后退、刷新
- 页面保存
"""
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_basic_navigation():
"""测试基础导航功能"""
print("=" * 60)
print("测试1: 基础导航和页面操作")
print("=" * 60)
# 创建浏览器实例
opts = FirefoxOptions()
opts.headless(False) # 显示浏览器窗口
page = FirefoxPage(opts)
try:
# 1. 导航到测试页面
test_page = os.path.join(os.path.dirname(__file__), 'test_pages', 'test_page.html')
test_url = 'file:///' + os.path.abspath(test_page).replace('\\', '/')
print(f"\n1. 导航到测试页面: {test_url}")
page.get(test_url)
print(f" ✓ 页面加载成功")
# 2. 获取页面信息
print(f"\n2. 获取页面信息:")
print(f" 标题: {page.title}")
print(f" URL: {page.url}")
print(f" HTML长度: {len(page.html)} 字符")
# 3. 导航到其他页面
print(f"\n3. 导航到其他页面:")
page.get('https://www.example.com')
print(f" 当前标题: {page.title}")
print(f" 当前URL: {page.url}")
# 4. 后退
print(f"\n4. 后退到上一页:")
page.back()
page.wait(1)
print(f" 当前标题: {page.title}")
# 5. 前进
print(f"\n5. 前进到下一页:")
page.forward()
page.wait(1)
print(f" 当前标题: {page.title}")
# 6. 刷新页面
print(f"\n6. 刷新页面:")
page.refresh()
page.wait(1)
print(f" ✓ 页面已刷新")
# 7. 保存页面
print(f"\n7. 保存页面:")
save_dir = os.path.join(os.path.dirname(__file__), 'output')
os.makedirs(save_dir, exist_ok=True)
# 保存为HTML
html_path = page.save(path=save_dir, name='example_page', as_pdf=False)
print(f" HTML已保存: {html_path}")
# 保存为PDF
pdf_path = page.save(path=save_dir, name='example_page', as_pdf=True)
print(f" PDF已保存: {pdf_path}")
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_basic_navigation()
导航事件链路的标准参考示例。
源码文件:app/content/ruyipage_examples/24_navigation_events.py · 仓库:24_navigation_events.py
#!/usr/bin/env python
# =============================
# RuyiPage 示例注释版
# 标题: 导航事件:started、load、fragment、history、committed、failed
# 说明: 导航事件链路的标准参考示例。
# 你会学到:
# 1. 订阅导航生命周期事件
# 2. 观察 navigationStarted、DOMContentLoaded 和 load
# 3. 观察 hash 片段跳转
# 4. 观察 History API 更新
# 5. 构造失败导航场景
# 相关 API: page.navigation.start, page.navigation.wait, page.navigation.wait_for_load, page.navigation.wait_for_fragment, page.navigation.stop
# =============================
# -*- coding: utf-8 -*-
"""示例24: Navigation 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 FirefoxPage
from ruyipage._functions.tools import find_free_port
from test_server import TestServer
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("测试 24: Navigation Events 导航事件测试")
print("=" * 70)
page = FirefoxPage()
server = None
results: List[Dict[str, str]] = []
try:
server = TestServer(port=find_free_port(9030, 9130)).start()
base_url = server.get_url("")[:-1]
tracked_events = [
"browsingContext.navigationStarted",
"browsingContext.fragmentNavigated",
"browsingContext.historyUpdated",
"browsingContext.domContentLoaded",
"browsingContext.load",
"browsingContext.navigationCommitted",
"browsingContext.navigationFailed",
]
if not page.navigation.start(tracked_events):
add_result(results, "导航事件订阅", "失败", "当前环境订阅导航事件失败")
print_results(results)
return
# 1. 基础导航事件
page.navigation.clear()
page.get(base_url + "/nav/basic")
started = page.navigation.wait("browsingContext.navigationStarted", timeout=3)
dom_loaded = page.navigation.wait("browsingContext.domContentLoaded", timeout=3)
loaded = page.navigation.wait_for_load(timeout=3)
if started and (started.url or "").endswith("/nav/basic"):
add_result(results, "navigationStarted", "成功", "收到基础导航开始事件")
else:
add_result(
results, "navigationStarted", "失败", "未观察到基础页面导航开始事件"
)
if dom_loaded and dom_loaded.context == page.tab_id:
add_result(
results, "domContentLoaded", "成功", "收到 DOMContentLoaded 事件"
)
else:
add_result(
results, "domContentLoaded", "失败", "未观察到 DOMContentLoaded 事件"
)
if loaded and loaded.context == page.tab_id:
add_result(results, "load", "成功", "收到 load 事件")
else:
add_result(results, "load", "失败", "未观察到 load 事件")
# 2. fragmentNavigated
page.get(base_url + "/nav/fragment")
page.navigation.clear()
page.run_js(
"""
location.hash = '#a';
setTimeout(function () { location.hash = '#b'; }, 100);
""",
as_expr=False,
)
first_fragment = page.navigation.wait_for_fragment("a", timeout=3)
second_fragment = page.navigation.wait_for_fragment("b", timeout=3)
if first_fragment and second_fragment:
add_result(
results,
"fragmentNavigated",
"成功",
f"两次片段导航已触发: {first_fragment.url} -> {second_fragment.url}",
)
else:
add_result(
results,
"fragmentNavigated",
"不支持",
"片段 URL 已变化,但当前 Firefox 未观察到标准 fragmentNavigated 事件",
)
# 3. historyUpdated
page.get(base_url + "/nav/history")
page.navigation.clear()
page.run_js(
"""
history.pushState({p:1}, 'P1', '?p=1');
history.pushState({p:2}, 'P2', '?p=2');
history.back();
""",
as_expr=False,
)
first_history = page.navigation.wait(
"browsingContext.historyUpdated", timeout=3
)
second_history = page.navigation.wait(
"browsingContext.historyUpdated", timeout=3
)
if first_history or second_history:
add_result(
results, "historyUpdated", "成功", "pushState/back 触发 historyUpdated"
)
else:
add_result(
results, "historyUpdated", "失败", "未观察到 historyUpdated 事件"
)
# 4. navigationCommitted
page.navigation.clear()
page.get(base_url + "/nav/basic?committed=1")
committed = page.navigation.wait(
"browsingContext.navigationCommitted", timeout=3
)
if committed and committed.context == page.tab_id:
add_result(
results,
"navigationCommitted",
"成功",
"普通导航触发 navigationCommitted",
)
else:
add_result(
results,
"navigationCommitted",
"跳过",
"当前环境未稳定观察到 navigationCommitted",
)
# 5. navigationFailed
page.navigation.clear()
try:
page.get("http://127.0.0.1:9/", timeout=2)
except Exception:
pass
failed = page.navigation.wait("browsingContext.navigationFailed", timeout=3)
if failed:
add_result(
results, "navigationFailed", "成功", "不可达地址触发 navigationFailed"
)
else:
add_result(
results,
"navigationFailed",
"跳过",
"当前环境未稳定观察到 navigationFailed",
)
# 6. navigationAborted
if page.navigation.start(["browsingContext.navigationAborted"]):
add_result(
results,
"navigationAborted",
"跳过",
"订阅成功,但本示例未构造稳定 aborted 场景",
)
else:
add_result(
results, "navigationAborted", "不支持", "当前 Firefox 不接受该事件名"
)
# 恢复默认跟踪,便于 finally 统一 stop
page.navigation.start(tracked_events)
print_results(results)
except Exception as e:
add_result(results, "示例执行", "失败", str(e)[:120])
print_results(results)
raise
finally:
try:
page.navigation.stop()
except Exception:
pass
try:
if server is not None:
server.stop()
except Exception:
pass
try:
page.quit()
except Exception:
pass
if __name__ == "__main__":
main()