news 2026/4/24 1:53:20

python playwright

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python playwright

# Selenium for Python:从基础到实战

Python Selenium,说穿了就是个让程序能像真人一样操控浏览器的工具。平时我们用鼠标点链接、填表单、翻页面这些事情,它都能用代码完成。不过这玩意儿远不止“自动化点击”那么简单。

它到底是什么

Selenium本质上是一套协议和驱动程序的组合。它不直接操作浏览器,而是通过WebDriver这个中间层来指挥浏览器干活。就像你雇了个司机,你跟司机说去哪儿,司机负责跟车沟通——WebDriver就是这个司机。

有意思的是,Selenium这套东西最初是为测试设计的,结果在爬虫领域反而更火爆。很多人用它来对付那些用JavaScript动态渲染的网站,普通爬虫拿到手的只有空白页面,Selenium却能拿到完整渲染后的内容。

能做什么

除了常见的填表单、点击按钮这些基础操作,有几种场景特别适合Selenium:

对付单页应用(SPA)。现在很多网站用React、Vue这类框架,页面内容不是一次性加载的,而是用户滚动或点击后才动态生成。用requests这种库只能拿到框架代码,Selenium能等到JavaScript执行完毕再拿数据。

处理复杂的交互逻辑。比如有些网站需要鼠标悬浮才能显示下拉菜单,或者需要拖拽验证码滑块。这类操作用普通HTTP库基本没辙,Selenium可以模拟鼠标事件。

做端到端测试。虽然不是开发者的主要用途,但配合unittest或pytest,可以写出自动化的功能测试。比如注册流程、购物车结算这类需要多步操作的场景。

不过得提醒一句:Selenium跑起来特别慢。每次启动都要开个浏览器,加载样式表、执行JavaScript,一个页面下来十几秒很正常。所以只适合那些不得不用的场景,不要什么网站都用它。

怎么使用

先装三个东西:selenium库、浏览器(Chrome/Firefox)、对应的驱动(chromedriver/geckodriver)。驱动版本必须和浏览器版本匹配,不然会报错。

基本套路是这个样子:

fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 启动浏览器driver=webdriver.Chrome()driver.get("https://example.com")# 找到元素并操作search_box=driver.find_element(By.NAME,"q")search_box.send_keys("Selenium")search_box.submit()# 获取信息results=driver.find_elements(By.CLASS_NAME,"result")forresultinresults:print(result.text)# 记得关闭driver.quit()

这里有个容易踩的坑:页面加载需要时间。如果代码执行得太快,元素还没出现在DOM里就去找,会抛出NoSuchElementException。所以经常要配合显式等待:

fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC wait=WebDriverWait(driver,10)element=wait.until(EC.presence_of_element_located((By.ID,"myId")))

这段代码的意思是:给元素最多10秒时间出现,如果时间到了还没出现就报错。比用time.sleep()瞎等要优雅得多。

最佳实践

使用无头模式。如果不需要看效果,可以用options.add_argument('--headless')让浏览器在后台运行。这样能省不少内存,速度也会快一些。

管理好资源。每个driver对象都是一个浏览器进程,用完调用.quit()是必须的。最好用with语句或者写在finally块里,防止异常时留下孤儿进程。

注意反爬策略。有些网站会检测Selenium的特征,比如navigator.webdriver这个变量。可以用参数禁用自动化标志:

options.add_experimental_option('excludeSwitches',['enable-automation'])

但这不是万能的,遇到更严格的检测该加代理还是加代理,该降低频率就降低频率。

不要滥用。Selenium每次启动都要几十兆内存,跑几十个页面就能吃光一台服务器。能用普通HTTP库解决的问题,千万别上Selenium。

和同类技术对比

Playwright(微软出品)算是Selenium的主要竞争对手。它支持更多的浏览器(包括Safari),API设计得更现代,默认就有等待机制,不用像Selenium那样手动加等待。还有一个好用的特性是自动录制脚本——打开录制工具操作一遍网站,就自动生成测试代码。

Puppeteer(谷歌出品)只支持Chrome和Chromium,但速度比Selenium快不少。它的API更简洁,文档也写得好。不过它用JavaScript,在Python里调用需要借助pyppeteer这种第三方封装。

PyAutoGUI和Selenium完全是两回事。PyAutoGUI是操作鼠标键盘的,不管你在哪个窗口它都能点、能输入。但它比较“瞎”——它靠像素坐标定位,不像Selenium能根据元素ID或CSS选择器来精确找到目标。改个分辨率或者屏幕缩放比例,PyAutoGUI就失效了。

### 从资深开发者的角度,聊聊Python Playwright

如果让我用一句话来形容Playwright,我会说:它像是一个拥有上帝视角的浏览器机器人。不是那种只能机械点按钮的工具,而是能“看懂”网页、能“思考”交互逻辑的自动化引擎。这一点,和它背后的微软团队脱不了干系——毕竟他们天天和浏览器打交道。

1. 他是什么

Playwright本质上是一个跨浏览器自动化库,但它做得更绝:它直接通过浏览器DevTools协议操控Chromium、Firefox和WebKit。这意味着它绕过了Selenium那种通过WebDriver中间人传话的笨重方式,和浏览器的交互是原生级别的。

举个例子,就像你开车,Selenium相当于你要先考个驾照(WebDriver),然后才能开;而Playwright直接给你一把万能钥匙,打开车门就能点火。这种底层差异,决定了它天生就快、稳、准。

2. 他能做什么

除了常规的UI测试、爬虫、RPA这些,Playwright有几个特别实在的杀手锏:

跨浏览器兼容性测试——同一个脚本,不加任何改动,就能同时在Chromium、Firefox和Safari上跑。以前用Selenium,光调这三个浏览器的WebDriver版本就够头疼的,更别提它们对CSS、JavaScript解析的不同。Playwright直接内置了三个浏览器引擎,你只管写逻辑,兼容性问题它替你兜着。

网络拦截与模拟——这功能真的太香了。比如你要测试一个支付页面,但每次测试都得真实付款。用Playwright可以拦截所有请求,返回预设的假数据。甚至能模拟网络延迟、断网、慢网速这些极端场景。以前做这些得搭复杂的代理服务器,现在一行代码搞定。

自动等待机制——这是无数人踩过的坑:页面加载慢了,元素还没出现就点击,报错。Playwright的自动等待做得非常聪明,它会智能判断元素何时真正可交互,而不是傻傻等固定时间。就像你等外卖,不是死守30分钟,而是看到外卖小哥身影才开始掏手机。

文件下载与上传——这功能看着普通,但实际用起来很惊艳。不仅能自动处理文件类型选择对话框,还能直接以二进制流形式获取文件内容,无需落到磁盘上。比如批量处理Excel报表,直接抓取后解析数据,跳过文件保存环节。

3. 怎么使用

先安装,这步最简单:

pipinstallplaywright playwrightinstall

第二行命令会下载三个浏览器的二进制文件,大约需要几百MB空间。如果不想要全部,可以用playwright install chromium只装Chrome。

接下来写个最基础的例子:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browser=p.chromium.launch(headless=False)# headless=True就是无头模式page=browser.new_page()page.goto("https://example.com")page.fill("#search-input","Python Playwright")page.click("#search-button")page.wait_for_selector(".result")print(page.title())browser.close()

这里有个小细节:page.fill()会先清空输入框再填入内容,比page.type()更可靠。因为有些网页的输入框有默认占位符文本。

进阶操作——比如拦截请求:

defhandle_request(route,request):ifrequest.url.endswith(".png"):route.abort()# 阻止所有图片加载,提升速度else:route.continue_()page.route("**/*.png",handle_request)

这招在爬取大量页面时特别管用,减少网络传输,速度提升50%以上。

4. 最佳实践

用Page Object模式组织代码。别把所有逻辑塞在一个脚本里,把每个页面封装成一个类。比如登录页、首页、搜索结果页各一个类,每个类里只放这个页面独有的操作。这样当某个页面UI改了,只需要改一个地方。

classLoginPage:def__init__(self,page):self.page=page self.username_input=page.locator("#username")self.password_input=page.locator("#password")self.login_button=page.locator("#login-btn")deflogin(self,username,password):self.username_input.fill(username)self.password_input.fill(password)self.login_button.click()

善用Trace Viewer。Playwright自带一个录制器,可以记录所有操作和网络请求。测试失败时,直接打开录制的trace文件,像看电影一样回放每一步。比看日志直观一百倍。

多浏览器并行测试。在CI/CD里,用pytest-playwright插件可以轻松实现多浏览器并行跑测试。比如三个浏览器各跑一个进程,总时间由最慢的那个决定,而不是串行累加。

不要滥用等待函数。虽然wait_for_timeout(3000)能用,但这相当于告诉代码“我不知道什么时候好,你就等3秒吧”。宁愿用wait_for_selectorwait_for_url,让浏览器告诉你“我准备好了”。

5. 和同类技术对比

vs Selenium

Selenium就像一辆手动挡的老款桑塔纳——它能跑,但你需要熟悉挂挡(WebDriver配置)、踩离合(处理各种异常)。而Playwright是自动挡的新能源车,起步快,驾驶体验舒服。特别是那些恼人的广告弹窗、iframe嵌套、新窗口打开,Selenium处理起来要写一堆样板代码,Playwright内置支持。

但Selenium有它的江湖地位:社区资源极其丰富,你遇到的任何问题几乎都能找到现成答案。而且它支持的编程语言更多,Java、C#玩家绕不开它。

vs Puppeteer

Puppeteer是Google亲儿子,只支持Chrome。它速度极快,但局限性也明显。如果你只做Chrome的测试或爬虫,Puppeteer轻量又好用,尤其是它的控制台调试体验很棒。但稍微复杂点的场景,比如需要同时测Safari的兼容性,就无能为力了。

Playwright更像是Puppeteer的爸爸(微软团队里很多就是从Puppeteer项目过来的),它吸取了Puppeteer的精华,又补上了跨浏览器这个关键短板。

vs Pyppeteer

Pyppeteer是Puppeteer的Python移植版,但它有个致命伤:维护频率低,bug修复慢。而Playwright是官方维护,版本迭代快,文档质量高。用Pyppeteer就像用社区版软件,而Playwright是商业级产品。

vs RPA工具(UiPath等)

RPA工具更偏向非技术用户,拖拽式操作。但如果你需要编写复杂的逻辑、做数据清洗、或集成进现有代码库,Playwright更灵活。比如你要从网页抓取1000条数据,然后调用API入库,用RPA工具写这些逻辑会很痛苦,而Playwright直接和Python生态无缝对接,Pandas、Requests想怎么用就怎么用。

话说回来,没有银弹。选择哪个工具,要看团队的技术栈和场景。如果团队里Java开发者居多、且项目需要兼容IE(Playwright不支持IE),那还得用Selenium。如果项目是纯Python、且追求极致速度和现代浏览器支持,Playwright就是最优解。

最后分享个实战经验:用Playwright做爬虫时,记得给每个页面设置page.set_viewport_size({"width": 1920, "height": 1080})。因为很多网站会根据视口大小返回不同的HTML结构,移动端的页面往往比PC端少很多元素。这看似是个小细节,但能让你少踩很多坑。
选择哪个技术,取决于具体场景:要做跨浏览器测试?选Playwright。只关心Chrome?Puppeteer够用。要对老系统做兼容?Selenium还是最稳妥的选择,毕竟它支持最老的浏览器版本。

还有个现实因素:团队习惯。如果团队熟悉Selenium的API,那换玩法的成本可能高于收益,这种情况下就算Selenium有一些固有缺陷,也未必值得迁移。

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

声光调制器:深圳优峰技术如何用“声波开关”撬动光系统精度?

你有没有想过,为什么光纤光栅传感系统能精准捕捉到桥梁的微小应变?为什么激光加工能实现微米级的切割精度?答案往往藏在一个不起眼的光器件里——声光调制器。它像个隐形的“声波开关”,用超声波控制光的传播路径,让原…

作者头像 李华
网站建设 2026/4/24 1:42:22

途虎股权曝光:腾讯持股19%是大股东 陈敏持股10%有48%投票权

雷递网 雷建平 4月23日途虎(股票代码:“09690”)今日发布2025年的年报。途虎执行董事分别为董事长、CEO陈敏、联合创始人、总裁胡晓东;非执行董事为姚磊文,独立非执行董事分别为颜惠萍女士、周凌霏女士、王静波。王玲洁…

作者头像 李华
网站建设 2026/4/24 1:39:02

别再傻傻分不清了!用Pikachu靶场实战演示:水平越权和垂直越权到底怎么测(附完整操作截图)

Web安全实战:Pikachu靶场中的水平与垂直越权漏洞深度解析 在数字化浪潮席卷各行各业的今天,Web应用安全已成为开发者必须直面的挑战。权限控制作为安全体系的核心支柱,一旦出现纰漏,往往会导致灾难性的数据泄露。对于刚踏入安全领…

作者头像 李华