使用 python selenium 和 Firefox 或 Chrome headless 截取整个页面的屏幕截图

2023-11-26

这篇文章与此相关:

Python selenium 屏幕截图无法获取整个页面

PhantomsJS 的解决方案似乎有效:

driver = webdriver.PhantomJS()    
driver.maximize_window()
driver.get('http://www.angelfire.com/super/badwebs/')  
scheight = .1
while scheight < 9.9:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
    scheight += .01        
driver.save_screenshot('angelfire_phantomjs.png')

然而,该解决方案是从 2014 年开始的,PhantomJS 同时已被弃用。我收到以下错误消息:

...
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '

如果我尝试适应例如Firefox 无头版是这样的:

from selenium import webdriver

firefox_options = webdriver.FirefoxOptions()
firefox_options.set_headless() 
firefox_driver = webdriver.Firefox(firefox_options=firefox_options)

firefox_driver.get('http://www.angelfire.com/super/badwebs/')  
scheight = .1
while scheight < 9.9:
    firefox_driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
    scheight += .01        
firefox_driver.save_screenshot('angelfire_firefox.png')

制作了屏幕截图,但不是整个页面。

有什么想法可以让它与 Firefox 或 Chrome headless 一起使用吗?

(P.S.我还发现了这篇文章:

使用 Selenium Python (chromedriver) 截取整页屏幕截图)

但这似乎不是一个通用的解决方案,而且要复杂得多。)


这是我想出的方法,可以完美地截取任意长度的网站屏幕截图。它利用了无头浏览器可以在运行前将窗口设置为任意大小的事实,挑战是在运行无头浏览器之前获取滚动高度。这是唯一的缺点,需要运行该网站两次。

from selenium import webdriver
from PIL import Image
from selenium.webdriver.chrome.options import Options
import time

url = 'any website url'

#run first time to get scrollHeight
driver = webdriver.Chrome()
driver.get(url)
#pause 3 second to let page load
time.sleep(3)
#get scroll Height
height = driver.execute_script("return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight )")
print(height)
#close browser
driver.close()

#Open another headless browser with height extracted above
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument(f"--window-size=1920,{height}")
chrome_options.add_argument("--hide-scrollbars")
driver = webdriver.Chrome(options=chrome_options)

driver.get(url)
#pause 3 second to let page loads
time.sleep(3)
#save screenshot
driver.save_screenshot('screen_shot.png')
driver.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python selenium 和 Firefox 或 Chrome headless 截取整个页面的屏幕截图 的相关文章

随机推荐

  • 如何在 Elm 中提交表单?

    这是一个非常基本的问题 但我没有找到任何例子 我有这样的看法 view address model div div text lt ID toString model id form input value model title text
  • SES AWS 错误代码:SignatureDoesNotMatch,状态代码:403

    我在尝试通过 Amazon SES 发送邮件时收到 AWS 错误代码 SignatureDoesNotMatch 状态代码 403 我已确认我使用的是通过以下方式创建的正确凭据https console aws amazon com iam
  • 检查 GET 中是否传递了任何变量

    我已经做了一些搜索 但没有得出任何结果 我确信这是显而易见的 基本上 我试图弄清楚是否有任何内容通过 GET 从表单传递 我知道如何检查单个元素 但我只想快速检查是否有任何内容通过 Cheers 使用时要小心count GET 如果您提交包
  • 如何在ActionBar的导航选项卡中设置自定义View并使选项卡适应其高度?

    我正在使用ActionBar我想设置一个自定义View在导航选项卡中 选项卡的高度似乎是固定的 我的自定义View较大 所以不适合 我尝试自定义样式 如下所示 但它并没有使选项卡更高 如何让选项卡的高度适应我的自定义View size 我知
  • 压缩 xml 文件的 Subversion diff

    我正在使用 MySQL Workbench 来维护应用程序的数据库架构 这 mwbWorkbench 使用的文件是一个压缩的 XML 文档 保存在 Subversion 存储库中 该文件被 Subversion 视为二进制数据 因此我无法使
  • 有没有办法跟踪批处理文件的执行情况?

    我继承了一些大型批处理文件 我想将它们重写为更 开发人员友好 的语言 我想了解以下几点 它调用了什么其他脚本 它启动了哪些其他进程 它写入哪些文件 它使用哪些环境变量 设置哪些环境变量 对于最后一点 我知道在开始之前我可以这样做 set g
  • Opengls eglCreateWindowSurface GL 错误 EGL_BAD_ALLOC

    我正进入 状态eglCreateWindowSurface GL Error EGL BAD ALLOC在三星 Galaxy S6 中安装后首次打开应用程序时 相同的代码在其他设备中运行良好 我尝试清理内存并销毁纹理并在销毁时取消初始化所有
  • 无法在 64 位 Linux 上构建 32 位 Wine

    我正在尝试这样做 使用 automake 配置脚本在 64 位 Linux 上构建 32 位 对我不起作用 编译酒 我在 config log 中找到了这个 configure failed program was confdefs h d
  • 使用 Python 处理 MySQL 未读结果

    我使用 mysql connector 进行 SQL 操作 我有一个简短的脚本 它在光标上执行以下操作 字符串 cursor execute use format db show tables command ALTER TABLE Obj
  • 使用 Array.CreateInstance 和 new 运算符实例化数组的区别

    我可以看到以下两种在 C 中实例化 int 数组的方法 通过 API系统 数组抽象类 var arrayInstance Array CreateInstance typeof int 4 通过各种数组初始化语法 var arrayInst
  • PHP 中的自动图像格式检测

    我正在寻找一种方法来获取当前放置在临时位置的用户上传的图像 例如 tmp jkhjkh78 并从中创建 php 图像 自动检测格式 有没有比一堆尝试 捕获 jpeg 图像 png 图像等更聪明的方法来做到这一点 这是的功能之一获取图像大小
  • iPhone 上的内嵌 html5 视频

    我想在 iPhone 上播放 HTML5 视频 但每当我尝试播放时 当调用视频 play 时 iPhone 都会自动弹出全屏 如何在 iPhone 不改变 UI 的情况下内嵌播放视频 如下所示 http www easy bits com
  • 使用 kubernetes 执行器时 Airflow-dag_id 无法找到问题

    我正在使用气流稳定的 Helm Chart 并使用 Kubernetes Executor 正在为 dag 安排新的 pod 但它因 dag id 无法找到问题而失败 我正在使用 git sync 来获取 dags 以下是错误和 kuber
  • UITableViewCell 圆角和剪辑子视图

    我在任何地方 搜索引擎 文档 此处等 都找不到任何内容来显示如何在也剪辑子视图的元素上创建圆角 尤其是在分组表视图中 我有代码可以正确地从具有 4 个弧 圆角 的路径创建一个圆角矩形 该代码已在我的子类 uitableviewcell 中的
  • 在 PHP 中处理格式错误的 JSON

    我正在尝试编写一个 php 脚本来处理来自以字符串形式提供 json 的 Web 服务的数据 问题是字符串并不是真正的 json 这是 JavaScript 具体来说 尽管变量被引用 但键未被引用 示例 实际数据更长且更复杂 desc Us
  • 无法读取 CFPrefsPlistSource iOS 10 中的值

    我今天已将 Xcode 8 更新到 beta 2 并尝试在 App 和 Today Extension 之间共享数据 我面临着这个日志警告 2016 07 08 18 00 24 732472 ProjetctX 941 42801 用户默
  • Junit:为删除实体的方法编写测试?

    最会是什么详尽的我可以为以下代码编写测试吗 public void deleteFromPerson person person person personRepository returnPerson person getId perso
  • 如何将字节数组转换为字符串,反之亦然?

    我必须在 Android 中将字节数组转换为字符串 但我的字节数组包含负值 如果我再次将该字符串转换为字节数组 我得到的值将与原始字节数组值不同 我该怎么做才能获得正确的转换 我用来进行转换的代码如下 Code to convert byt
  • 在 Grafana 仪表板中嵌入网站

    我运行 Grafana 7 2 0 开源版 需要将网站嵌入仪表板本身 也就是说 我需要一排或两排常用的图表面板 并在它们下面嵌入一个需要定期重新加载的外部网站 我怎样才能实现这个目标 貌似没有相关插件https grafana com gr
  • 使用 python selenium 和 Firefox 或 Chrome headless 截取整个页面的屏幕截图

    这篇文章与此相关 Python selenium 屏幕截图无法获取整个页面 PhantomsJS 的解决方案似乎有效 driver webdriver PhantomJS driver maximize window driver get