playwrigth截图,如何截取画面一边固定,另一边是滚动条的长图
使用Playwright截取一边固定、另一边是滚动条的长图可以通过以下步骤实现:
打开网页并导航到需要截图的页面。
获取页面的宽度和高度,可以使用page.evaluate函数执行JavaScript代码来获取页面尺寸。
设置视口的宽度为固定部分的宽度,可以使用page.setViewportSize函数来设置视口大小。
使用page.screenshot函数进行第一次截图,得到固定部分的图像。
计算需要滚动的高度,即总高度减去固定部分的高度。
使用page.evaluate函数执行JavaScript代码,通过滚动页面的方式滚动到需要截图的位置。
使用循环或递归的方式多次截取滚动部分的图像,每次滚动一个固定的高度,并将这些图像拼接起来。
将固定部分的图像与滚动部分的图像进行合并,得到最终的长图。
之前有实现过吗
参考gpt:
要实现这个功能,您可以使用Playwright库中的scroll
方法和screenshot
方法。下面是一个示例代码:
const playwright = require('playwright');
(async () => {
const browser = await playwright.chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
// 获取整个页面的高度
const scrollHeight = await page.evaluate(() => {
return Promise.resolve(document.documentElement.scrollHeight);
});
// 设置视口大小以便可以截取整个页面
await page.setViewportSize({
width: 1280,
height: scrollHeight
});
// 循环滚动页面并截取长图
let screenshotBuffer = null;
for (let y = 0; y < scrollHeight; y += 1000) { // 每次滚动 1000 像素
await page.scroll(0, y);
const screenshot = await page.screenshot({ fullPage: true });
if (!screenshotBuffer) {
screenshotBuffer = screenshot;
} else {
screenshotBuffer = Buffer.concat([screenshotBuffer, screenshot]);
}
}
// 将长图保存到文件或者上传到服务器
// ...
await browser.close();
})();
该代码将使用Chromium浏览器启动Playwright,然后导航到https://example.com
网站。接下来,它获取整个页面的高度,并设置视口大小以便可以截取整个页面。然后,它循环滚动页面并截取长图,将每次截图的结果拼接在一起,最终得到一个完整的长图。最后,您可以将长图保存到文件或者上传到服务器。
Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行。
Playwright提供的自动化技术是绿色的、功能强大、可靠且快速,支持Linux、Mac以及Windows操作系统。
从官网的解释,官方给Playwright定位是一款真正意义上的Web端到端测试工具。
gpt:
您可以使用 page.screenshot()
方法来截取长图。首先,您需要确定要截取的元素,然后使用 elementHandle.boundingBox()
方法来获取该元素的位置和大小。接下来,您可以使用 page.screenshot()
方法来截取整个页面,然后使用 image.crop()
方法来裁剪出您想要的部分。最后,您可以将多个截取的图片拼接在一起,形成长图。
以下是示例代码:
# 导入必要的库
from playwright.sync_api import Playwright, sync_playwright
# 定义要截取的元素
element_selector = "#my-element"
# 定义截取的范围
viewport_width, viewport_height = 800, 600
scroll_width, scroll_height = await page.evaluate("() => [document.body.scrollWidth, document.body.scrollHeight]")
page_width, page_height = max(viewport_width, scroll_width), max(viewport_height, scroll_height)
# 打开页面并等待元素加载完成
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("<https://example.com>")
page.wait_for_selector(element_selector)
# 获取元素位置和大小
element_handle = page.query_selector(element_selector)
bounding_box = await element_handle.bounding_box()
# 计算需要截取的图片数量
image_height = bounding_box["height"]
num_images = int((scroll_height - viewport_height) / image_height) + 1
# 创建一个空的 Image 对象
image = Image.new("RGBA", (page_width, page_height), (255, 255, 255, 255))
# 截取每个图片并拼接在一起
for i in range(num_images):
# 计算当前要截取的位置
y = i * image_height
scroll_y = y + viewport_height
# 截取整个页面
screenshot = page.screenshot(full_page=True)
# 裁剪出当前图片,并将其粘贴到 Image 对象中
crop = screenshot.crop((0, y, page_width, y + image_height))
image.paste(crop, (0, y))
# 滚动页面
await page.evaluate(f"window.scrollTo(0, {scroll_y})")
# 保存图片
image.save("screenshot.png")
请注意,上述示例代码仅供参考。您需要根据实际情况进行调整和优化,以确保截取出的长图质量和效率的平衡。