Python Playwright中page.wait_for_url()正则表达式失效?与JavaScript版本存在实现差异
Python Playwright中page.wait_for_url()正则表达式失效?与JavaScript版本存在实现差异
嘿,这个问题我之前踩过坑!本质是Playwright的Python和JavaScript版本对wait_for_url/waitForURL的参数处理逻辑不一样,导致你写的Python代码没生效~
先给你拆解问题出在哪:
- 你写的Python代码里,
page.wait_for_url(r"docs/api")传的是普通字符串,Playwright Python对普通字符串的处理逻辑是前缀匹配(如果带*/?这类通配符才会按glob模式),不是子字符串包含匹配。而目标URL是https://playwright.dev/python/docs/api/class-page,前缀是https://...,显然和docs/api不匹配,所以会超时失败。 - 而JavaScript版本里,你传的是正则字面量
/docs\/api/,Playwright JS会直接用这个正则去匹配整个URL的任意部分,自然能命中docs/api这段子串,所以成功了。
下面给你两种可行的解决方案:
方案一:用正则表达式(和JS版本逻辑对齐)
需要先导入re模块,用re.compile()把正则字符串编译成re.Pattern对象,再传给wait_for_url。修改后的代码如下:
from playwright.sync_api import sync_playwright import re with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://playwright.dev/python/docs/api/class-page") # 编译正则表达式后传入 page.wait_for_url(re.compile(r"docs/api")) browser.close()
方案二:用glob模式匹配子串
如果不想用正则,也可以用glob通配符**来匹配任意路径部分,这样就可以命中包含docs/api的URL:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://playwright.dev/python/docs/api/class-page") # 用**匹配任意前缀和后缀 page.wait_for_url("**/docs/api/**") browser.close()
最后再补个小细节,帮你区分两边的实现差异:
- JavaScript Playwright:
page.waitForURL()支持直接传入正则字面量,内部会用正则匹配整个URL内容; - Python Playwright:
page.wait_for_url()的参数类型决定匹配逻辑:- 普通字符串:无通配符则前缀匹配,有通配符则glob匹配;
re.Pattern对象:按正则规则匹配;- 自定义函数:按你写的逻辑判断是否匹配。
备注:内容来源于stack exchange,提问作者Maksim Shamihulau
相关产品推荐
相关产品推荐

