最近研究控制Chrome API来进行自动截图的方法。然后就看到了博客园的文章https://www.cnblogs.com/superhin/archive/2004/01/13/11481910.html 。文章说Selenium并不支持对整个页面截图,原因是Chrome虽然在开发者工具中提供了“Capture full size screenshot”的Run Command,但是在CDP中并没有提供executeCdpCommand
的命令。
为了解决这个问题,鄙人把Chromium的源代码扒了出来,然后看到这个“Capture full size screenshot”实际上走的是先设置了一个设备模拟把高度调成和页面高度一样,然后再截当前屏幕截图。
鄙人也留意了一下国外的编程社区,发现国外基本上也是这么干的,临时设置了一个设备模拟,然后截当前屏幕的截图,截好图了再把设备模拟关闭。
这样的话使用Python语言操作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from selenium import webdriver from time import sleep import base64
options = webdriver.ChromeOptions() options.debugger_address = "127.0.0.1:9222" driver = webdriver.Chrome(options=options)
page_width = driver.execute_script("return document.body.scrollWidth") page_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_cdp_cmd('Emulation.setDeviceMetricsOverride', {'mobile':False, 'width':page_width, 'height':page_height, 'deviceScaleFactor': 1})
res = driver.execute_cdp_cmd('Page.captureScreenshot', { 'fromSurface': True})
with open('hao123.png', 'wb') as f: img = base64.b64decode(res['data']) f.write(img)
sleep(15)
driver.execute_cdp_cmd('Emulation.clearDeviceMetricsOverride', {})
|