跳转到内容

自动化 API

VirtualBrowser 基于 Chromium 开发,可以使用 playwright 或者其他 chromium 的自动化测试工具进行开发。

TIP

查看API 文档

Python Demo

python
import asyncio
import json
import requests
from playwright.async_api import async_playwright


class PlaywrightManager:
    """
    Playwright管理器类
    用于管理浏览器上下文和页面实例的创建与管理
    """
    def __init__(self):
        """
        初始化PlaywrightManager
        contexts: 存储浏览器上下文的字典
        pages: 存储页面实例的嵌套字典
        """
        self.contexts = {}
        self.pages = {}

    async def get_context(self, context_id):
        """
        获取或创建浏览器上下文
        Args:
            context_id: 上下文标识符
        Returns:
            browser context实例
        """
        if context_id in self.contexts:
            return self.contexts[context_id]
        else:
            context = await self.browser.new_context()
            self.contexts[context_id] = context
            return context

    async def get_page(self, context_id, page_id):
        """
        获取或创建页面实例
        Args:
            context_id: 上下文标识符
            page_id: 页面标识符
        Returns:
            page实例
        """
        context = await self.get_context(context_id)
        if context_id not in self.pages:
            self.pages[context_id] = {}
        if page_id in self.pages[context_id]:
            return self.pages[context_id][page_id]
        else:
            page = await context.new_page()
            self.pages[context_id][page_id] = page
            return page

    async def launch_browser(self):
        """启动浏览器实例"""
        async with async_playwright() as p:
            self.browser = await p.chromium.launch(headless=False)

    async def close_browser(self):
        """关闭浏览器实例"""
        await self.browser.close()


async def main():
    """
    主函数:演示如何使用PlaywrightManager进行浏览器自动化
    包含API调用启动浏览器、连接CDP、页面操作等功能
    """
    # 初始化管理器
    manager = PlaywrightManager()
    await manager.launch_browser()

    # API配置
    BASE_URL = "http://localhost:9000"
    data = {"id": 1}
    headers = {
        "Content-Type": "application/json",
        "api-key": "XXXXXXXXXX"
    }

    # 通过API启动浏览器环境
    try:
        response = requests.post(
            f"{BASE_URL}/api/launchBrowser",
            headers=headers,
            data=json.dumps(data)
        )
        response_data = response.json()
        print("启动浏览器响应:", response_data)
    except Exception as err:
        print(f"启动浏览器失败: {err}")
        return

    # 检查启动是否成功
    if not response_data.get("success"):
        print("启动浏览器失败")
        return

    # 获取调试端口
    debugging_port = response_data.get("data", {}).get("debuggingPort")
    if not debugging_port:
        print("未找到调试端口")
        return

    # 使用Playwright连接到浏览器
    async with async_playwright() as p:
        # 通过CDP协议连接到浏览器
        manager.browser = await p.chromium.connect_over_cdp(
            f"http://localhost:{debugging_port}"
        )

        # 管理浏览器上下文和页面
        contexts = manager.browser.contexts
        if contexts:
            # 使用已存在的上下文
            context = contexts[0]
            manager.contexts["default"] = context
            page = await context.new_page()
            if "default" not in manager.pages:
                manager.pages["default"] = {}
            manager.pages["default"]["main"] = page
        else:
            # 创建新的上下文和页面
            context = await manager.get_context("default")
            page = await manager.get_page("default", "main")

        # 演示:访问百度首页
        await page.goto("https://www.baidu.com")

        # 在这里可以添加更多的自动化测试代码
        # 例如:页面交互、数据抓取等

        # 通过API关闭浏览器
        try:
            stop_response = requests.post(
                f"{BASE_URL}/api/stopBrowser",
                headers=headers,
                data=json.dumps(data)
            )
            stop_response_data = stop_response.json()
            print("关闭浏览器响应:", stop_response_data)
            if not stop_response_data.get("success"):
                print("通过API关闭浏览器失败")
        except Exception as err:
            print(f"关闭浏览器时出错: {err}")


# 运行主函数
if __name__ == "__main__":
    asyncio.run(main())

License BSD