当前位置: 首页 > news >正文

Python 之程序截图的几种方式(含chromedriver下载链接)

各个版本的谷歌 chromedirver 链接

国内镜像地址:https://registry.npmmirror.com/binary.html?path=chrome-for-testing/

pywin32 + PyQt5

需要先 pip 安装 pywin32、PyQt5 ,相关依赖 pip 会自动安装。

pip install pywin32 pip install PyQt5

下面这种方式比较强悍,可以根据活跃窗口的 title 名称,自动找到对应的窗口然后进行截图。

import sys import win32gui from PyQt5.QtWidgets import QApplication class Window(object): def __init__(self, hwnd): self.hwnd = hwnd self.window_title = win32gui.GetWindowText(hwnd) self.window_class_name = win32gui.GetClassName(hwnd) self.window_rect = win32gui.GetWindowRect(hwnd) def __str__(self): return f"hwnd: {self.hwnd}, window_title: {self.window_title}, window_class_name: {self.window_class_name}, window_rect: {self.window_rect}" class WindowsHandler(object): def __init__(self): self.current_windows = [] self._init_all_windows() def _init_all_windows(self): win32gui.EnumWindows(self._get_window, 0) def _get_window(self, hwnd, nouse): if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd): self.current_windows.append(Window(hwnd)) def get_windows_by_title(self, title_name): return [window for window in self.current_windows if title_name in window.window_title] def screenshot_window_byPyQt(self, window: Window, img_save_path): app = QApplication(sys.argv) screen = QApplication.primaryScreen() img = screen.grabWindow(window.hwnd).toImage() img.save(img_save_path) if __name__ == '__main__': wh = WindowsHandler() windows = wh.get_windows_by_title("Looooking") if windows: window = windows[0] print(window) wh.screenshot_window_byPyQt(window, "./test.png")

pygetwindow + PIL

这种方式需要向激活窗口,让窗口处于最顶端然后进行截图。

import pygetwindow as gw from PIL import ImageGrab if __name__ == '__main__': windows = gw.getWindowsWithTitle("Looooking") for window in windows: print(window) window.activate() # 激活窗口,将窗口置顶 box = window._getWindowRect() screenshot = ImageGrab.grab(box) screenshot.save('test.png') # 保存截图到文件 break

pyautogui

安装好 pyautogui 库就好了,这个库主要用于鼠标键盘模拟操作,当然屏幕截图也是手到擒来。

只不过这种方式除了全屏截图之外,其他只能使用像素点去截图,而且只能截取置顶的界面。

import pyautogui if __name__ == '__main__': screenshot = pyautogui.screenshot() # 截全屏 screenshot.save("full.png") # screenshot = pyautogui.screenshot(region=(100, 100, 500, 500)) # 截图指定区域部分 # screenshot.save("part.png") windows = pyautogui.getWindowsWithTitle("Looooking") for window in windows: window.activate() screenshot = pyautogui.screenshot(region=window._getWindowRect()) screenshot.save("part.png") break

selenium

chromedriver(114 及以前的旧版): CNPM Binaries Mirror

chromedriver(115 及之后的新版):https://www.cnblogs.com/aiyablog/articles/17948703

还可以使用 selenium 对打开的浏览器窗口截图,selenium可以将打开的页面进行截图,但是无法截取url等更大的范围。

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC if __name__ == '__main__': options = webdriver.ChromeOptions() service = webdriver.ChromeService(executable_path=r"./driver/chromedriver.exe") driver = webdriver.Chrome(options=options, service=service) driver.implicitly_wait(3) driver.maximize_window() driver.get('https://www.baidu.com/s') xpath_input = '//*[@id="kw"]' # 搜索框 xpath_search = '//*[@id="su"]' # 搜索按钮 ele_input = driver.find_element(By.XPATH, xpath_input) ele_input.clear() ele_input.send_keys("百度") driver.find_element(By.XPATH, xpath_search).click() WebDriverWait(driver, 3).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="page"]/div/strong/span'))) driver.save_screenshot("./test.png") driver.quit()
http://www.cnnetsun.cn/news/1333106.html

相关文章:

  • android studio项目 gradle-xx-bin.zip下载失败或很慢的解决方法
  • AperiSolve 开源项目教程
  • 企业决策视角下微服务全链路性能瓶颈分析平台对比及实践指南
  • 【C语言】程序环境与预处理
  • SCUT_thesis项目:解决长章名换行后不居中的排版问题
  • PowerPlatformConnectors三大类型深度对比:自定义、认证与独立发布者连接器怎么选?
  • Pleaserun vs 手动编写init脚本:效率提升10倍的秘密
  • dbblog部署教程:Docker容器化部署与服务器配置全流程
  • AniVu BitTorrent下载功能深度测评:速度与稳定性全面测试
  • DC-TTS语音合成效果对比:LJ Speech与KSS数据集实测
  • 提升Haskell开发效率:ghcid高级功能与实用技巧
  • Saasify:让API变现从未如此简单!一站式实现API商业化的终极指南
  • Ikemen-GO开发者指南:用Go语言构建自定义格斗游戏引擎
  • GoMLX未来路线图:即将发布的5大令人期待的功能
  • lidar_camera_calib常见问题排查:从数据准备到结果验证的全流程避坑指南
  • 如何用tinygrad实现高效目标检测:YOLO和RetinaNet完整指南
  • 如何用tinygrad实现高效全局优化:从模拟退火到能量最小化的完整指南
  • 提升深度学习模型性能:tinygrad图像数据增强完全指南
  • 如何利用tinygrad数据流水线实现高效数据加载和预处理:从理论到实践
  • 为什么选择gorilla/csrf?深入解析Go语言中最受欢迎的CSRF防护库
  • 终极指南:Renovate如何通过智能机制实现实时安全更新防护
  • 如何使用bevy_ecs_tilemap创建你的第一个瓦片地图:从安装到运行的简单教程
  • Ragnar开发者指南:如何利用IPC API构建自定义窗口管理插件
  • 终极Docker镜像优化指南:使用Dive实现99%效率的完整教程
  • 从入门到精通:Android Emulator Runner多API级别与设备配置实践
  • 如何为Tailwind Next.js Starter Blog配置自动化测试:Jest与React Testing Library完整指南
  • 【开题答辩全过程】以 基于ssm校园教室设备检修管理系统为例,包含答辩的问题和答案
  • 如何高效处理fzf加载事件:从初始列表到高级配置的完整指南
  • 华为OD机试双机位C卷-不等式是否满足约束并输出最大差 (C/C++/Py/Java/Js/Go)
  • Java毕业设计基于springboot+Vue框架的学生交流互助平台16603185