使用 playwright 在 Nodejs 环境下自动控制浏览器!

本文介绍了如何使用 Playwright 这个由微软开发的 Node.js 库来自动化控制浏览器,包括初始化项目、安装依赖、打开浏览器、模拟移动设备、获取页面元素和内容等操作。同时,文章提到了 Playwright 相比 Puppeteer 支持更多浏览器,并展示了自动执行过程可见的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Playwright 是微软开发的开源 Nodejs 库,对基于Chromium,Firefox 和 WebKit 的浏览器自动化控制实现了相同的 API。

Playwright 和 Puppeteer 功能基本一致,但是 Puppeteer 只支持基于 Chromium 的浏览器

开始

初始化项目以及安装依赖

// 初始当前项目路径,此处应使用你自己定义的路径
mkdir playwright && cd playwright

// 按照自定义配置完善仓库信息
npm init

// 安装时注意
// 在默认安装时会同时安装浏览器驱动
// 在网络不好的情况下,需要用户自己更换 npmnpm i -D playwright

示例

打开浏览器进入百度并截图

// 此处使用 chrome 来进行相关代码操作
const { chromium } = require('playwright');

const main = async () => {
    const browser = await chromium.launch()

    const page = await browser.newPage();
	
    // 进入百度的网页
    await page.goto('https://www.baidu.com')
    
    // path 为相对路径下的文件,保存的文件对应目录为 playwright/image.png
    page.screenshot({ path: 'image.png' })

    browser.close()
}

main()

执行代码

node index.js

此时会发现当前目录下已经新生成了 image.png 文件

模拟移动设备进入百度页面并进行截图

在实际使用中,不仅仅只有 pc 端,还有手机端页面。Playwright 也提供了相关了驱动直接设置浏览器打开方式。还内置了常用的手机 DPI 设置

image-20201223105954806

我们可以直接查看所有内置的驱动定义,下面我统一都使用预设的 iPhone 11 来驱动

// 调整 playwright/index.js 代码
const { chromium, devices } = require('playwright');

const main = async () => {
    const browser = await chromium.launch()

    const phoneD = devices['iPhone 11']
    const context = await browser.newContext({ ...phoneD })

    const page = await context.newPage();

    await page.goto('https://www.baidu.com')
    await page.screenshot({ path: 'image.png' })

    await page.close()
    browser.close()
}

main()

获取页面上的元素

const { chromium, devices } = require('playwright');

const main = async () => {
    const browser = await chromium.launch()

    const phoneD = devices['iPhone 11']
    const context = await browser.newContext({ ...phoneD })

    const page = await context.newPage();

    await page.goto('https://www.baidu.com')
    await page.screenshot({ path: 'image.png' })

    // 等待 2s 加载
    await page.waitForTimeout(2000)

    const logo = await page.$('#logo')

    await logo.screenshot({ path: 'logo.png' })

    await page.close()
    browser.close()
}

main()

在浏览器进入页面之后,在此处等待 2s 图片加载。Playwright 提供了 $(单节点) (节点集合)(节点集合) ()$(大量节点) 三个页面节点选择器,分别对应选择的数量。其中参数为 css 的文档选择器。此处我直接通过 logo 节点的 id 获取到 dom 并进行截图保存到 logo.png,新的截图如下图。

image-20201223111816507

获取页面内容

Playwright 可以直接获取节点属性值,也就是我们要访问的数据本身。此处我们来获取 LOGO 的图片地址。

const { chromium, devices } = require('playwright');

const main = async () => {
    const browser = await chromium.launch()

    const phoneD = devices['iPhone 11']
    const context = await browser.newContext({ ...phoneD })

    const page = await context.newPage();

    await page.goto('https://www.baidu.com')
    await page.screenshot({ path: 'image.png' })

    // 等待 2s 加载
    await page.waitForTimeout(2000)

    const logoImg = await page.$('#logo > a > img')

    const src = await logoImg.evaluate(n => n.src)
    console.log(src)

    await page.close()
    browser.close()
}

main()

image-20201223112706221

执行完成之后 Logo 的地址已经在控制台上输出出来。

更多

自动执行过程可见

Playwright 默认使用 ‘无头’ 模式运行,这个时候对开发者来说不能检测到运行过程。可以在启动时添加配置显示浏览器界面。

const browser = await chromium.launch({ headless: false })

image-20201223113317426

现在我们就能看到浏览器运行的界面啦!

最后

就我个人使用来看,Playwright 当前完成度已经非常高,社区也很活跃。但是还是存在一些不能解决的问题,例如不支持 IE11、无法直接和现有项目直接对接等问题。

!!在此仅使用百度页面来进行演示操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值