安装命令

python --version(3.8以上的)
pip install playwright
昨天面试官问我conda venv和pip的区别和优劣势。。。
playwright install chromium
但然也可以给所有的浏览器安装 playwirght install

解决报错

Traceback (most recent call last):
File “C:\Users\派大鑫\Desktop\hello\测试\1.py”, line 6, in
page.goto(“https://baidu.com”)
File “D:\python\Lib\site-packages\playwright\sync_api_generated.py”, line
9019, in goto
self._sync(
File “D:\python\Lib\site-packages\playwright_impl_sync_base.py”, line
115, in _sync
return task.result()
^^^^^^^^^^^^^
File “D:\python\Lib\site-packages\playwright_impl_page.py”, line 555, in
goto
return await self._main_frame.goto(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\python\Lib\site-packages\playwright_impl_frame.py”, line 153,
in goto
await self._channel.send(
File “D:\python\Lib\site-packages\playwright_impl_connection.py”, line
69, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\python\Lib\site-packages\playwright_impl_connection.py”, line
559, in wrap_api_call
raise rewrite_error(error, f"{parsed_st[‘apiName’]}: {error}") from None
playwright._impl._errors.Error: Page.goto: net::ERR_CONNECTION_CLOSED at
https://baidu.com/
Call log: - navigating to “https://baidu.com/”, waiting until “load”

这个错误 net::ERR_CONNECTION_CLOSED 表示网络连接被关闭,无法访问
https://baidu.com。可能的原因包括:

  1. 网络连接问题 - 检查网络连接是否正常
  2. 防火墙或代理设置 - 防火墙或代理可能阻止了浏览器访问网络
  3. SSL/TLS 证书问题 - 可能存在证书验证问题

可以尝试以下解决方案:

● Update(测试\1.py)
⎿ Updated 测试\1.py with 2 additions and 2 removals
1 from playwright.sync_api import sync_playwright
2
3 with sync_playwright() as p:
4 - browser = p.chromium.launch(headless=False)
4 + browser = p.chromium.launch(headless=False
+ , args=[‘–ignore-certificate-errors’])
5 page = browser.new_page()
6 - page.goto(“https://baidu.com”)
6 + page.goto(“https://baidu.com”, timeout=30000)
7 print(page.title())
8 browser.close()
9 \ No newline at end of file

● 我添加了两个参数来解决潜在的连接问题:

  1. args=[‘–ignore-certificate-errors’] - 忽略SSL证书错误
  2. timeout=30000 - 增加30秒超时时间

如果还是有问题,也可以尝试:

  1. 检查网络连接:在浏览器中手动访问 baidu.com
  2. 尝试其他网站:比如 page.goto(“http://example.com”)
  3. 使用代理(如果需要):p.chromium.launch(proxy={“server”:
    “http://proxy:port”})

如果问题仍然存在,请告诉我具体的错误信息。

解决措施:关闭开了全局模式的梯子

昨天面试官还问了我一个问题 就是公钥和私钥的问题,他说在公共场合下如何实现两个人的秘密通信,就是使用到了公私钥,其实就是在底层的让我剖析HTTPS协议中的SSL和TLS,如果我要是好好的申请到SSL证书就好了。
公私钥如何解决三大通信安全问题
我们通常关心三个问题:机密性、身份验证 和 完整性。

解决机密性问题(防窃听)

目标:确保信息只有预期的接收者才能阅读,即使被第三方截获也无法解密。

过程(A 想发送机密信息给 B):

B 生成自己的公私钥对,并将公钥公开发布给 A(或者 A 从服务器获取)。

A 用 B 的公钥对要发送的信息进行加密,得到密文。

A 将密文发送给 B。

B 收到密文后,使用自己私藏的私钥对密文进行解密,得到原始信息。
(大家都知道彼此的公钥 但是只用对应的私钥能解决公钥加密的内容)

为什么安全?

即使攻击者在步骤2和3之间截获了密文,他也无法解密,因为他没有 B 的私钥。

用公钥加密的信息,只有对应的私钥才能解开。公钥本身无法解密它加密的内容。

类比:这就像 B 公开发行了一种特制的“锁”(公钥),任何人都可以拿到这把锁并把箱子锁上。但一旦锁上,只有 B 自己拥有的唯一“钥匙”(私钥)才能打开。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, args=['--ignore-certificate-errors'])
    page = browser.new_page()
    page.goto("https://baidu.com", timeout=30000)
    print(page.title())
    browser.close()

这就说明playwright就是成功的安装了!

MCP服务器部署

先看传统的Playwright脚本的实现

from playwright.sync_api import sync_playwright


def test_login():
    with sync_playwright() as p:
        # 启动浏览器
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()

        # 导航到登录页面
        page.goto("https://smart.mail.163.com/login.htm")

        # 输入凭据
        page.fill("#username", "testuser")
        page.fill("#password", "password123")

        # 点击登录按钮
        page.click("#login-btn")

        # 验证登录成功
        assert page.is_visible(".dashboard")

        # 执行登出
        page.click("#logout-btn")

        browser.close()

基于MCP的AI驱动实现

现在,使用Playwright MCP实现相同的测试流程

import asyncio
from playwright.async_api import async_playwright
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain.tools import Tool
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate


class PlaywrightTester:
    def __init__(self):
        self.browser = None
        self.page = None

    async def setup(self):
        """初始化浏览器"""
        playwright = await async_playwright().start()
        self.browser = await playwright.chromium.launch(headless=True)
        self.page = await self.browser.new_page()

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

    async def navigate_to_url(self, url: str) -> str:
        """导航到指定URL"""
        try:
            await self.page.goto(url)
            title = await self.page.title()
            return f"成功导航到 {url},页面标题: {title}"
        except Exception as e:
            return f"导航失败: {str(e)}"

    async def fill_input(self, selector: str, value: str) -> str:
        """填充输入框"""
        try:
            await self.page.fill(selector, value)
            return f"成功在 {selector} 中填入: {value}"
        except Exception as e:
            return f"填充输入框失败: {str(e)}"

    async def click_button(self, selector: str) -> str:
        """点击按钮"""
        try:
            await self.page.click(selector)
            return f"成功点击: {selector}"
        except Exception as e:
            return f"点击失败: {str(e)}"

    async def get_current_url(self) -> str:
        """获取当前URL"""
        return await self.page.url()

    async def get_page_content(self) -> str:
        """获取页面内容"""
        return await self.page.content()


async def create_playwright_tools():
    """创建 Playwright 工具集"""
    tester = PlaywrightTester()
    await tester.setup()

    tools = [
        Tool(
            name="navigate_to_url",
            func=lambda url: asyncio.run(tester.navigate_to_url(url)),
            description="导航到指定URL"
        ),
        Tool(
            name="fill_input",
            func=lambda data: asyncio.run(tester.fill_input(data['selector'], data['value'])),
            description="在输入框中填写内容,输入格式: {'selector': 'css选择器', 'value': '要填写的值'}"
        ),
        Tool(
            name="click_button",
            func=lambda selector: asyncio.run(tester.click_button(selector)),
            description="点击按钮或链接"
        ),
        Tool(
            name="get_current_url",
            func=lambda: asyncio.run(tester.get_current_url()),
            description="获取当前页面URL"
        )
    ]

    return tools, tester


async def run_ui_test():
    # 创建 Playwright 工具
    tools, tester = await create_playwright_tools()

    # 构建测试智能体
    llm = ChatOpenAI(model="gpt-4o", temperature=0)

    # 系统提示词
    prompt = ChatPromptTemplate.from_messages([
        ("system", """你是一个专业的UI测试助手。请使用提供的工具来测试网页功能。

重要提示:
1. 首先使用 navigate_to_url 工具打开目标网页
2. 使用 fill_input 工具填写表单,参数格式: {{'selector': 'css选择器', 'value': '值'}}
3. 使用 click_button 工具点击按钮
4. 使用 get_current_url 工具验证跳转结果

请逐步执行测试任务。"""),
        ("human", "{input}")
    ])

    agent = create_tool_calling_agent(llm, tools, prompt)
    agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

    # 执行测试任务
    try:
        result = await agent_executor.ainvoke({
            "input": "请测试后台登录页面(https://admin.example.com/login)的登录功能。使用测试账号'test@example.com'和密码'123456'进行登录,并验证登录成功后是否跳转到了仪表盘页面。注意:你需要先找到用户名和密码输入框的选择器。"
        })
        print("测试结果:", result["output"])
    finally:
        await tester.close()


# 运行
if __name__ == "__main__":
    asyncio.run(run_ui_test())

我这里版本不兼容没有运行起来。。。。。

无所谓。。。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐