当前位置: 首页 > news >正文

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:表示详细模式:在控制台中显示每个测试用例的完整名称

http://www.jsqmd.com/news/99070/

相关文章:

  • LangFlow中各类Agent组件详解
  • HuggingFace自定义模型接入Anything-LLM指南
  • 镜正理念:从字母“pq”与“bd”看唯悟主义的超越
  • Qwen3-VL-8B API调用与部署实战
  • GNSS位移监测站:滑坡、地裂在线监测解决方案
  • Qwen3-8B集成MCP实现动态工具调用
  • Qwen3-VL-30B模型下载与校验全指南
  • 收藏!AI大模型应用开发工程师全景指南,小白程序员必看
  • ENSP网络仿真器与GPT-SoVITS语音传输性能测试
  • TensorFlow 2.5.0 GPU版安装全流程
  • FLUX.1-dev本地部署指南:从镜像下载到避坑实战
  • Qwen3-32B Docker镜像部署:5分钟跑起大模型
  • Wan2.2-T2V-A14B本地部署全攻略
  • 互联网大厂Java求职者面试全场景技术问答:涵盖Spring Boot与微服务架构
  • Wan2.2-T2V-A14B:消费级GPU上的视频生成革命
  • 类、结构体或枚举的数组-–-behaviac
  • 防爆气象站该如何正确选择
  • LangFlow在金融领域构建风险评估AI流程
  • Qwen3-VL-30B + OCR实现端到端文档智能解析
  • Playwright03-CDP/WebSocket/PlayWright
  • 国产光伏气象站
  • EmotiVoice社区版与商业版功能对比选型指南
  • 汽车EDI: Knorr-Bremse EDI 需求分析
  • 百度语音技术PK GPT-SoVITS:谁更适合中文TTS?
  • Excalidraw使用技巧:从数据到图表的高效转化
  • Seed-Coder-8B-Base支持自定义微调吗?
  • Windows下Excalidraw远程协作部署实战
  • TensorRT-LLM加速大模型推理实战
  • 孢子捕捉仪孢子捕捉分析系统
  • ComfyUI_ACE-Step:高效音乐生成与编辑新工具