0

0

Python怎样实现网页自动化?Playwright

星夢妙者

星夢妙者

发布时间:2025-08-06 13:40:02

|

344人浏览过

|

来源于php中文网

原创

选择playwright而非selenium的主要原因是其架构更优、原生支持异步、内置自动等待机制以及一致的多浏览器支持;2. playwright通过直接与浏览器通信提升执行效率和稳定性;3. 其异步api设计使并发操作更自然高效;4. 自动等待元素状态减少了显式等待代码,提升脚本可靠性;5. 支持chromium、firefox和webkit且api统一,便于跨浏览器测试;6. 处理动态内容可使用page.wait_for_selector等待元素出现;7. 文件上传通过set_input_files方法实现;8. 文件下载需监听download事件并调用save_as保存;9. 网络请求拦截可用page.route模拟响应或阻止资源加载;10. 弹窗处理通过page.on("dialog")事件自动接受或取消;11. 提升脚本健壮性应优先使用data-testid等稳定选择器;12. 避免依赖复杂dom结构的css选择器或xpath;13. 错误处理需结合try-except捕获超时或元素缺失异常;14. 日志记录关键步骤有助于调试和维护;15. 推荐采用page object model设计模式封装页面元素和操作;16. 将配置信息如url、密码等外置到.env或json文件中便于环境切换和安全维护。

Python怎样实现网页自动化?Playwright

Python实现网页自动化,Playwright无疑是一个非常现代且高效的选择。它提供了一套简洁而强大的API,能够跨浏览器(Chromium、Firefox、WebKit)进行操作,并且原生支持异步,这让处理复杂的网页交互变得更加流畅和可靠。

解决方案

要用Python和Playwright实现网页自动化,首先得安装它。一个简单的

pip install playwright
就能搞定,然后别忘了运行
playwright install
来下载所需的浏览器驱动。

通常,我会从一个异步上下文管理器开始,这样能确保浏览器实例在使用完毕后被妥善关闭。比如,访问一个网站,点击某个元素,然后截个图,这基本是自动化脚本的入门级操作了。

立即学习Python免费学习笔记(深入)”;

import asyncio
from playwright.async_api import async_playwright

async def automate_example():
    async with async_playwright() as p:
        # 启动 Chromium 浏览器,可以设置 headless=False 看到浏览器界面
        browser = await p.chromium.launch(headless=True)
        # 创建一个新的页面
        page = await browser.new_page()

        try:
            # 导航到目标网站
            print("正在导航到示例网站...")
            await page.goto("https://www.example.com")
            print("页面加载完成。")

            # 验证页面标题
            title = await page.title()
            print(f"页面标题是: {title}")
            assert "Example Domain" in title

            # 假设页面上有一个链接,我们想点击它
            # Playwright的定位器非常强大,推荐使用 page.get_by_role, page.get_by_text 等
            # 这里为了演示,假设有一个 id 为 'more-info' 的链接
            # 如果没有实际的元素,这部分代码会报错,但演示的是思路
            # await page.click("#more-info") # 如果有这样的元素

            # 更健壮的定位方式,例如通过文本内容定位一个链接
            # 找到包含 "More information..." 文本的链接
            print("尝试查找并点击链接...")
            more_info_link = page.get_by_text("More information...")
            if await more_info_link.is_visible():
                await more_info_link.click()
                print("链接已点击。")
                # 等待页面导航完成,或者等待某个元素出现
                await page.wait_for_load_state("networkidle")
                print(f"新页面标题: {await page.title()}")
            else:
                print("未找到 'More information...' 链接。")


            # 截取屏幕截图
            screenshot_path = "example_screenshot.png"
            await page.screenshot(path=screenshot_path)
            print(f"截图已保存到: {screenshot_path}")

        except Exception as e:
            print(f"自动化过程中发生错误: {e}")
        finally:
            # 关闭浏览器
            await browser.close()
            print("浏览器已关闭。")

# 运行自动化函数
if __name__ == "__main__":
    asyncio.run(automate_example())

这段代码展示了Playwright的基础用法:启动浏览器、打开页面、导航、定位元素、交互以及截图。实际应用中,你可能需要处理更复杂的选择器、等待策略和错误处理。

为什么选择 Playwright 而不是 Selenium?

在我看来,选择Playwright而非Selenium,主要有几个令人信服的理由。首先,架构上的优势。Playwright直接与浏览器进行通信,而不是通过中间的WebDriver协议。这意味着它能更快速、更可靠地执行操作,因为它减少了中间层的开销和潜在的同步问题。尤其是在处理一些微妙的浏览器事件时,Playwright的表现往往更稳定。

其次,原生异步支持。Python的Playwright库是围绕

asyncio
设计的,这让它在处理并发操作时显得非常自然和高效。如果你需要同时操作多个页面,或者等待某些网络请求完成,异步编程模型能让你写出更清晰、更不容易阻塞的代码。而Selenium虽然也能配合异步库使用,但它本身的设计并非原生异步,用起来总觉得有点“拧巴”。

再者,内置的自动等待机制。Playwright在执行操作(比如点击、输入)时,会智能地等待元素变得可见、可点击,或者等待网络请求完成,这大大减少了因为元素未加载而导致的脚本失败。Selenium在这方面需要你手动添加大量的

WebDriverWait
,这不仅增加了代码量,也更容易出错。我个人在使用Playwright时,很少需要显式地写等待逻辑,这让开发体验流畅很多。

最后,多浏览器支持和一致性。Playwright开箱即用地支持Chromium、Firefox和WebKit,并且API在不同浏览器之间保持高度一致。这意味着你写一套脚本,就能在主流浏览器上运行,这对于跨浏览器测试来说简直是福音。Selenium虽然也支持多浏览器,但由于各浏览器驱动的实现差异,有时候你可能需要针对特定浏览器做一些调整。

Playwright 在复杂场景下的应用技巧

在面对复杂的网页自动化任务时,Playwright提供了很多高级功能,能让你的脚本更加健壮和灵活。

一个常见的挑战是处理动态内容和AJAX加载。仅仅等待页面加载完成(

page.wait_for_load_state("networkidle")
)可能不够,因为很多内容是异步加载的。这时,
page.wait_for_selector()
就非常有用,它会等待指定的元素出现在DOM中并变得可见。例如,如果你点击一个按钮后,某个数据表格才会加载出来,你可以这样写:
await page.click("button#load-data")
,然后
await page.wait_for_selector("table#data-table")

另一个是处理文件上传和下载。文件上传通常通过

page.set_input_files()
方法实现,你只需要指定文件选择器和文件路径列表即可。

多奥淘宝客程序API免费版 F8.0
多奥淘宝客程序API免费版 F8.0

多奥淘宝客程序免费版拥有淘宝客站点的基本功能,手动更新少,管理简单等优点,适合刚接触网站的淘客们,或者是兼职做淘客们。同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。4月3日淘宝联盟重新开放淘宝API申请,新用户也可使用了

下载
# 假设有一个文件输入框 
await page.set_input_files("input#upload-file", "path/to/your/file.txt")
# 如果需要,可能还需要点击一个提交按钮
# await page.click("button#submit-upload")

文件下载则需要监听

page.on("download", ...)
事件。

async def handle_download(download):
    print(f"文件即将下载: {download.suggested_filename}")
    # 将文件保存到指定路径
    await download.save_as(f"downloads/{download.suggested_filename}")

page.on("download", handle_download)
# 执行触发下载的操作,比如点击一个下载链接
await page.click("a#download-link")

网络请求拦截是Playwright的另一个强大功能,可以用来模拟API响应、阻止不必要的资源加载或者调试网络问题。你可以用

page.route()
来拦截请求。

# 拦截所有对特定API的请求,并返回一个模拟的JSON响应
await page.route("**/api/data", lambda route: route.fulfill(
    status=200,
    content_type="application/json",
    body='{"message": "Hello from Playwright mock!"}'
))

# 阻止所有图片加载,加速测试
await page.route("**/*.{png,jpg,jpeg,gif,svg}", lambda route: route.abort())

# 导航到页面,此时对 /api/data 的请求会被拦截,图片不会加载
await page.goto("https://some-website-with-api-and-images.com")

处理弹窗和对话框(如alert、confirm、prompt)也相对直接,Playwright提供了

page.on("dialog", ...)
事件。

page.on("dialog", lambda dialog: asyncio.ensure_future(dialog.accept())) # 自动接受所有弹窗
# 或者根据dialog.type和dialog.message来决定接受还是取消
# page.on("dialog", lambda dialog: asyncio.ensure_future(dialog.dismiss() if "确认" in dialog.message else dialog.accept()))

这些技巧能让你在面对各种复杂的网页交互时,依然能写出高效且可靠的自动化脚本。

自动化脚本的健壮性与维护

编写自动化脚本,光能跑起来还不够,关键在于它是否健壮、易于维护。毕竟,网页结构总在变,一点小改动就可能让你的脚本失效。

选择器的策略是核心。我个人倾向于使用那些不容易变化的属性作为选择器。如果网页开发人员在元素上设置了

data-testid
data-qa
这样的属性,那绝对是首选,因为这些是专门为自动化测试设计的,通常不会轻易变动。

# 优先使用 data-testid
await page.click('[data-testid="submit-button"]')
# 或者使用文本内容
await page.get_by_text("登录").click()
# 尽量避免使用过于依赖DOM层级的CSS选择器,比如 body > div:nth-child(2) > form > input:nth-child(1)
# 这种选择器一旦DOM结构变化就很容易失效

如果这些都没有,我才会考虑使用ID(如果存在且唯一),然后是类名,最后才是XPath或复杂的CSS选择器。但即使使用XPath或CSS,也要尽量选择最短、最独特的路径,避免依赖过多的父子关系。

错误处理是保证脚本健壮性的关键。简单的

try-except
块可以捕获预期的错误,比如元素未找到。

try:
    await page.click("#non-existent-element", timeout=5000) # 设置超时
except TimeoutError:
    print("点击元素超时,可能元素不存在或加载过慢。")
except Exception as e:
    print(f"发生未知错误: {e}")

日志记录也至关重要。一个好的日志系统能帮助你追踪脚本的执行流程,并在失败时提供线索。你可以使用Python内置的

logging
模块,记录每个关键步骤和潜在的错误信息。

对于大型项目,Page Object Model (POM) 是一个非常推荐的设计模式。它将网页的每个页面或组件抽象成一个独立的Python类,将页面元素的选择器和操作封装在这些类中。这样做的好处是,当页面结构发生变化时,你只需要修改对应的Page Object类,而不需要修改所有引用这些元素的测试脚本,大大提高了代码的可维护性。

# 简单的Page Object示例
class LoginPage:
    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-button")

    async def navigate(self):
        await self.page.goto("https://example.com/login")

    async def login(self, username, password):
        await self.username_input.fill(username)
        await self.password_input.fill(password)
        await self.login_button.click()

# 在测试中使用
# login_page = LoginPage(page)
# await login_page.navigate()
# await login_page.login("myuser", "mypass")

最后,环境配置。将URL、用户名、密码等敏感或经常变化的配置信息从代码中分离出来,放到配置文件(如

.env
文件或JSON文件)中。这样,你可以在不修改代码的情况下,轻松地在不同环境(开发、测试、生产)之间切换。这让脚本更灵活,也更安全。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

750

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

635

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号