Python Playwright:函数复用已打开Page对象及外部变量方法
问题解决方法
你的代码存在几个核心问题:page对象未传入函数、loc变量未传递、重复初始化Playwright上下文,还有车型文本获取的语法错误,以下是修正方案:
关键修改点
- 将
page和loc作为参数传入run函数,让函数直接使用已打开的浏览器页面和当前地点值 - 移除循环中重复创建的
sync_playwright上下文,复用已经初始化好的浏览器和页面 - 修正车型名称的获取方式,改用Playwright官方的
text_content()方法
修正后的完整代码
from playwright.sync_api import Playwright, sync_playwright, expect locationList = [ 'London Luton Airport', 'London Hilton', 'London City', 'London Wembley', 'London Battersea', 'London Shepherds Bush' ] def run(page, loc): # 点击地点输入框并填充当前地点 page.locator("[placeholder=\"Find a location\"]").click() page.locator("[placeholder=\"Find a location\"]").fill(loc) # 点击匹配的地点选项(若定位不准可调整为更精确的选择器) page.locator(f'text={loc}').click() # 点击显示报价按钮(每次切换地点需触发) page.locator("button:has-text(\"Show offers\")").click() # 等待页面加载完成,避免元素未渲染 page.wait_for_load_state("networkidle") # 获取所有车型名称 carnames = page.locator("//h2[@class='vehicle-item__title']") # 直接获取所有元素的文本内容列表 carnamelist = carnames.all_text_contents() print(f"地点 {loc} 的车型列表:") print(carnamelist) if __name__ == "__main__": with sync_playwright() as playwright: # 仅初始化一次浏览器和页面 chromium = playwright.chromium browser = chromium.launch(channel="chrome", headless=False) page = browser.new_page() page.set_viewport_size({"width": 1920, "height": 1080}) page.goto("https://www.sixt.co.uk/") # 仅同意一次隐私政策 page.locator("[data-testid=\"uc-accept-all-button\"]").click() # 遍历地点列表,复用同一个page对象 for loc in locationList: run(page, loc) # 任务完成后关闭浏览器 browser.close()
额外说明
- 原代码中手动填充"luton"的测试操作已移除,循环会自动处理所有地点
- 若地点选择器
text={loc}无法匹配目标元素,可替换为原代码的XPath写法:page.locator(f'//div[text()="{loc}"]').click() - 添加
page.wait_for_load_state("networkidle")确保页面加载完成后再获取元素,避免因渲染延迟导致的空列表问题
内容的提问来源于stack exchange,提问作者Singh
相关产品推荐
相关产品推荐

