在做自动化测试时,最头疼的莫过于登录环节的滑块验证——尤其是部分网站风控严格,不仅滑块难滑,甚至会识别 Playwright 自动化浏览器,直接提示「操作过于频繁」,导致脚本无法正常运行。近期在测试时,我踩遍了滑块登录的坑,最终摸索出一套「绕过滑块、免登录直接打开页面,再进行脚本录制」的完整方案,亲测100%有效,今天整理成博客,分享给有同样困扰的小伙伴。
一、问题背景:滑块登录+风控拦截
最初使用 Playwright 做自动化时,直接启动浏览器访问登录页,遇到两个致命问题:
-
1. 滑块验证无法自动化绕过,手动滑动后仍提示「操作过于频繁」,推测网站检测到了 Playwright 自动化特征(如 navigator.webdriver 标记);
-
2. 尝试保存登录状态、接管浏览器等方法,要么报错「连接失败」「端口被占用」,要么打开后仍是登录页,无法继承手动登录状态;
核心痛点:网站风控拦截自动化浏览器,常规登录+录制方法完全失效,需找到「既绕开滑块,又能让 Playwright 正常录制」的解决方案。
二、核心思路:手动登录保存状态,免登录打开页面再录制
既然网站会拦截 Playwright 启动的浏览器,那我们就换个思路:用「本机正常 Chrome 手动登录」,保存登录状态后,让 Playwright 加载该状态,直接打开目标页面(无需再登录、无需滑滑块),此时再进行脚本录制,即可完美绕开风控和滑块。
整体流程:手动登录并保存状态 → 加载登录状态打开目标页面 → 启动 Playwright 录制 → 生成自动化脚本,全程无滑块、无频繁提示。
三、分步操作:从0到1实现免登录录制(亲测可复现)
前提准备
1. 已安装 Playwright(若未安装,执行命令:pip install playwright,再执行 playwright install 安装浏览器驱动);
2. 本机安装 Chrome 浏览器(确保是常用版本,避免驱动不兼容);
步骤1:手动登录,保存登录状态(只做1次)
首先编写一段「保存登录状态」的脚本,核心作用是:用 Playwright 启动浏览器,手动完成登录后,将登录态(cookie、localStorage 等)保存到本地文件,后续可直接加载使用,无需重复登录。
创建文件 save_login_state.py,复制以下代码(直接运行即可):
from playwright.sync_api import sync_playwright
# 登录状态保存路径(可自定义,建议和后续脚本放在同一目录)
STATE_FILE = "login_state.json"
# 登录页地址
LOGIN_URL = "你的网站登录地址"
def save_login_state():
with sync_playwright() as p:
# 启动浏览器(显示界面,关闭无头模式,添加防检测参数)
browser = p.chromium.launch(
headless=False,
args=["--disable-blink-features=AutomationControlled"]
)
context = browser.new_context()
page = context.new_page()
# 打开登录页
page.goto(LOGIN_URL)
print("=" * 60)
print("👉 请在弹出的浏览器中手动操作:")
print(" 1) 输入账号、密码")
print(" 2) 完成滑块验证(慢慢滑,避免提示频繁)")
print(" 3) 点击登录,成功进入商品管理后台")
print("👉 登录成功后,回到命令行按【回车】保存登录状态")
print("=" * 60)
# 手动控制保存时机,避免自动等待卡死
input("\n登录成功后,按回车保存登录状态...")
# 保存完整登录态(cookie + localStorage + sessionStorage)
context.storage_state(path=STATE_FILE)
print(f"✅ 登录状态已保存到:{STATE_FILE}(后续可直接加载使用)")
# 关闭浏览器
browser.close()
if __name__ == "__main__":
save_login_state()
运行脚本后,按提示操作:
-
1. 弹出 Chrome 浏览器,手动输入账号密码、滑动滑块,登录成功进入商品管理页;
-
2. 回到命令行,按回车键,脚本会自动保存登录状态到 login_state.json 文件;
-
3. 保存成功后,命令行会提示「登录状态已保存」,此时可关闭浏览器。
步骤2:验证免登录打开页面(可选,确保状态有效)
为了确认登录状态保存成功,可编写一段「加载登录状态、直接目标页面」的脚本,测试是否无需登录即可进入。
创建文件 open_product_page.py,复制以下代码:
-
from playwright.sync_api import sync_playwright # 加载之前保存的登录状态文件 STATE_FILE = "login_state.json" # 目标页面 TARGET_URL = "你想要录制的页面" # 函数:打开目标页面(免登录) def open_product_page(): with sync_playwright() as p: browser = p.chromium.launch( headless=False, args=["--disable-blink-features=AutomationControlled"] ) # 加载登录状态,免登录进入 context = browser.new_context(storage_state=STATE_FILE) page = context.new_page() # 直接打开 page.goto(TARGET_URL) print("✅ 已免登录打开页面,当前地址:", page.url) # 保持浏览器打开,方便确认 input("按回车关闭浏览器...") browser.close() if __name__ == "__main__": open_product_page()运行脚本后,若能直接打开(无需登录、无滑块),说明登录状态保存成功;若仍跳登录页,重新执行步骤1(确保登录成功后再按回车保存)。
步骤3:免登录启动录制,生成自动化脚本
登录状态验证通过后,即可启动 Playwright 录制功能——此时 Playwright 会加载登录状态,直接打开目标页面,我们在页面上的所有操作,都会被自动录制并生成代码。
操作步骤:
-
打开 CMD 命令行(或 PowerShell),进入「login_state.json 文件所在的目录」(关键!否则会找不到登录状态文件);
-
在终端中输入以下命令,启动录制(直接复制运行):
-
playwright codegen --load-storage login_state.json 目标页面 -
录制完成后,关闭浏览器和录制窗口,将录制窗口中的代码复制到本地 .py 文件,即可直接运行(无需再处理登录和滑块)
四、常见问题&避坑指南(亲测踩过的坑)
坑1:启动录制时提示「找不到 login_state.json」
原因:命令行未进入「login_state.json 所在目录」,Playwright 无法加载登录状态。
解决:重新进入目录(按步骤3的方法),再执行录制命令。
坑2:加载登录状态后,仍跳登录页
原因:登录状态保存不完整(比如未登录成功就按了回车),或登录状态过期。
解决:删除旧的 login_state.json,重新执行步骤1,确保登录成功后再保存状态。
坑3:录制命令报错「retrieving websocket url」
原因:之前启动的浏览器未关闭,端口被占用,或 Chrome 路径配置异常。
解决:关闭所有 Chrome 浏览器,重新执行录制命令;若仍报错,重启电脑后再尝试。
坑4:手动登录时,一直提示「操作过于频繁」
原因:网站风控标记了当前 IP 或浏览器环境。
解决:关闭所有浏览器,断网5-10分钟,或切换手机热点(换 IP),再重新手动登录。
&spm=1001.2101.3001.5002&articleId=159761860&d=1&t=3&u=abb9e57a6a314a95b03b70399023c875)
377

被折叠的 条评论
为什么被折叠?



