news 2026/5/28 17:06:07

Playwright新人笔记学习记录(鉴权2)--Day5

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Playwright新人笔记学习记录(鉴权2)--Day5

今天自己手动部署了jenkins和Docker,实现CICD,结果发现一个问题,如果单个运行测试类是没有问题的,但是批量运行就会失败。

报错信息如下所示,提示定位元素超时了。

最后我发现是批量运行时,保存的cookie失效了,导致只成功运行了第一个测试函数,后续的测试函数全部失败了,于是我添加了一个判断cookie是否生效的逻辑。

先看看我刚开始的conftest配置文件中的代码。

@pytest.fixture(scope="session") def auth_state(browser) -> Path: """ session 级别:只登录一次,生成 state.json 返回状态文件路径 """ if not STORAGE_STATE_PATH.exists(): STORAGE_STATE_PATH.parent.mkdir(parents=True, exist_ok=True) context = browser.new_context(**DEVICE_CONFIG) page = context.new_page() try: page.goto("http://xxxx.com/") page.locator('input[type="tel"]').fill('xxxxx') page.get_by_role("checkbox").click() page.get_by_text("下一步").click() captcha_input = page.locator('input[placeholder="请输入"][maxlength="6"]') captcha_input.wait_for(state="visible", timeout=10000) captcha_input.fill('123456') page.wait_for_url("http://xxxxx/#/workbench") context.storage_state(path=STORAGE_STATE_PATH) finally: context.close() return STORAGE_STATE_PATH

第一次我判断了保存cookie的文件是否存在,但是没有判断是否生效,导致运行失败,下面我贴上我增加了判断逻辑失效的代码。

def is_auth_valid(state_path: Path) -> bool: if not state_path.exists(): return False try: context = browser.new_context(storage_state=state_path, **DEVICE_CONFIG) page = context.new_page() page.goto("http://xxxxxx.com/#/workbench", wait_until="domcontentloaded")# 关键判断:如果登录失效,通常会自动跳转到 /login 或首页登录框 # 所以我们检查 URL 是否仍然是 workbench,且没有出现登录输入框 current_url = page.url has_login_input = page.locator('input[type="tel"]').count() > 0 context.close() # 如果还在 workbench 且没出现登录输入框,就认为有效 return "/workbench" in current_url and not has_login_inputexcept Exception: return False

关键判断逻辑是红色的这块代码,获取当前的current_url,并判断当前获取的url中是否包含"/workbench"以及当前页面是否还存在登录输入框,因为/workbench是我登录后首页的url路径。

如果失效了,那么整个函数就会返回False,这样程序就会重新走一遍登录流程并重新保存一次登录cookie。

下面是全部代码。

@pytest.fixture(scope="session") def auth_state(browser) -> Path: """ session 级别:只登录一次,生成 state.json 返回状态文件路径 """ def is_auth_valid(state_path: Path) -> bool: if not state_path.exists(): return False try: context = browser.new_context(storage_state=state_path, **DEVICE_CONFIG) page = context.new_page() page.goto("http://xxxx.com/#/workbench", wait_until="domcontentloaded") # 关键判断:如果登录失效,通常会自动跳转到 /login 或首页登录框 # 所以我们检查 URL 是否仍然是 workbench,且没有出现手机号输入框 current_url = page.url has_login_input = page.locator('input[type="tel"]').count() > 0 context.close() # 如果还在 workbench 且没出现登录输入框,就认为有效 return "/workbench" in current_url and not has_login_input except Exception: return False # 如果状态文件不存在,或已失效,则重新登录 if not is_auth_valid(STORAGE_STATE_PATH): STORAGE_STATE_PATH.unlink(missing_ok=True) STORAGE_STATE_PATH.parent.mkdir(parents=True, exist_ok=True) context = browser.new_context(**DEVICE_CONFIG) page = context.new_page() try: page.goto("http://xxxxx.com/") page.locator('input[type="tel"]').fill('xxxxx') page.get_by_role("checkbox").click() page.get_by_text("下一步").click() captcha_input = page.locator('input[placeholder="请输入"][maxlength="6"]') captcha_input.wait_for(state="visible", timeout=10000) captcha_input.fill('123456') page.wait_for_url("http://xxxxx.com/#/workbench", timeout=15000) context.storage_state(path=STORAGE_STATE_PATH) finally: context.close() return STORAGE_STATE_PATH

注:单个运行测试类或者测试函数的命令为:pytest test_login.py::TestDemo::test_login

批量运行测试类或者测试函数的命令为:python -m pytest tests/ --html=report.html --self-contained-html -v

test_login.py:测试文件名

TestDemo:测试类名

test_login:测试函数名

tests/:目录名

--html=report.html:输出为一个 HTML 文件,文件名为report.html

--self-contained-html:将 CSS、JavaScript、图片等资源内嵌到 HTML 文件中

-v:表示详细模式:在控制台中显示每个测试用例的完整名称

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 12:35:13

YOLO-V5快速上手指南:从环境搭建到检测

YOLO-V5实战入门:从零构建目标检测系统 在智能安防、工业质检和自动驾驶日益普及的今天,如何快速实现一个高精度、可落地的目标检测系统,成了许多开发者面临的现实问题。传统的两阶段检测器虽然精度高,但推理速度慢;而…

作者头像 李华
网站建设 2026/5/23 22:21:29

Dify智能体平台融合GPT-SoVITS打造拟人客服系统

Dify智能体平台融合GPT-SoVITS打造拟人客服系统 在客户服务正从“能用”迈向“好用”的今天,用户不再满足于冷冰冰的自动回复。他们期待的是有温度、有辨识度、甚至能唤起信任感的声音交互体验。然而,传统语音客服系统长期受限于音色单一、定制成本高、部…

作者头像 李华
网站建设 2026/5/28 3:00:07

中小企业备份方案: 本地备份 vs. 云备份, 哪个是企业最佳选择?

越来越多的中小企业正在混合云环境中运营,它们必须在保障数据安全的同时,平衡成本、灵活性与控制力。基于云和本地的数据及工作负载之间的分界线正不断变化,这就要求备份与恢复解决方案必须具备高度的通用性。过去十年间,云备份与…

作者头像 李华
网站建设 2026/5/26 20:27:24

Veeam 恢复演练与合规解决方案:快速洁净的恢复保证

利用 Veeam 备份与恢复方案,通过经过测试、可审计的恢复计划自动化执行每一步恢复任务,在最关键的时刻证明企业面对网络威胁的就绪状态。在洁净室中验证洁净恢复点自动捕获审计证据演练本地恢复及云端恢复Veeam 恢复方案优势验证每一次恢复的洁净备份文件…

作者头像 李华
网站建设 2026/5/27 11:30:18

91n节点也能高效跑AI?借助清华镜像部署轻量级TensorFlow服务

91n节点也能高效跑AI?借助清华镜像部署轻量级TensorFlow服务 在不少中小型团队或教育机构的AI实践中,一个现实问题始终挥之不去:如何在有限的计算资源下——比如仅有91个节点的小型集群——快速、稳定地部署一套可用的AI推理服务&#xff1f…

作者头像 李华
网站建设 2026/5/27 15:02:33

Linux下使用Miniconda搭建Python环境

Miniconda:现代AI开发的轻量级环境管理利器 在今天的数据科学和人工智能项目中,你是否曾遇到过这样的场景?一个模型在本地训练得好好的,部署到服务器却报错“模块找不到”;或者两个项目分别依赖不同版本的PyTorch&…

作者头像 李华