PlayWright结合MCP
python --version(3.8以上的)昨天面试官问我conda venv和pip的区别和优劣势。。。但然也可以给所有的浏览器安装 playwirght install。
安装命令
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。可能的原因包括:
- 网络连接问题 - 检查网络连接是否正常
- 防火墙或代理设置 - 防火墙或代理可能阻止了浏览器访问网络
- 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
● 我添加了两个参数来解决潜在的连接问题:
- args=[‘–ignore-certificate-errors’] - 忽略SSL证书错误
- timeout=30000 - 增加30秒超时时间
如果还是有问题,也可以尝试:
- 检查网络连接:在浏览器中手动访问 baidu.com
- 尝试其他网站:比如 page.goto(“http://example.com”)
- 使用代理(如果需要):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())
我这里版本不兼容没有运行起来。。。。。
无所谓。。。
更多推荐

所有评论(0)