web自动化:6种窗口截图方法、文件打开形式、文件路径及时间戳命名

本文主要介绍6种窗口截图方式及源码分析,其中包括整屏截图和根据定位的元素截取相应的图片。此外,在窗口截图方法种还用到了文件路径、时间戳命名、文件打开方式等,在文中也将简单的做介绍。
在这里插入图片描述

一、窗口截图方法

常用的窗口截图方法是get_screenshot_as_file(filename)和save_screenshot(filename),这两种方法可以直接生成图片。
get_screenshot_as_png()和get_screenshot_as_base64()不能直接生成图片,需要进行进一步的操作。

1、get_screenshot_as_base64()

使用该方法截图后的图片是以base64加密过的,需要使用base64.b64decode(img)其进行解密。并且,解密后的是二进制的,还需要将其进一步操作。
使用该方法截取的是整屏的图片。
在这里插入图片描述

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

driver.find_element(By.ID, "kw").send_keys("搜索")

img = driver.get_screenshot_as_base64()
img = base64.b64decode(img)
with open("./img.png", "wb") as f:
    f.write(img)

sleep(2)
driver.quit()

2、screenshot_as_base64

该方法和get_screenshot_as_base64()类似,结果都是加密过的。但是此方法可以根据定位元素进行图片的截取。
注意:screenshot_as_base64没有括号。

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

element = driver.find_element(By.ID, "kw")
element.send_keys("搜索")

img = element.screenshot_as_base64
img = base64.b64decode(img)
with open("./img.png", "wb") as f:
    f.write(img)

sleep(2)
driver.quit()

3、get_screenshot_as_png()

与get_screenshot_as_base64()类型,结果是二进制的,不能直接生成图片,需要进一步操作。与get_screenshot_as_base64()不同的是,该方法的结果不是加密的。
get_screenshot_as_png()源码return的是b64decode(self.get_screenshot_as_base64().encode(“ascii”))。
使用该方法截取的是整屏的图片。
在这里插入图片描述

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

element = driver.find_element(By.ID, "kw")
element.send_keys("搜索")

img = driver.get_screenshot_as_png()
with open("./img.png", "wb") as f:
    f.write(img)

sleep(2)
driver.quit()

4、screenshot_as_png

该方法和get_screenshot_as_png()类似,结果是二进制的。但是此方法可以根据定位元素进行图片的截取。
注意:screenshot_as_png没有括号。

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

element = driver.find_element(By.ID, "kw")
element.send_keys("搜索")

img = element.screenshot_as_png
with open("./img.png", "wb") as f:
    f.write(img)

sleep(2)
driver.quit()

5、get_screenshot_as_file(filename)

使用该方法可以直接生成图片,不需要进行额外的处理。实际上,源码中get_screenshot_as_file(filename)方法是将get_screenshot_as_png()方法进行处理的。
使用该方法截取的是整屏的图片。
在这里插入图片描述

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

element = driver.find_element(By.ID, "kw")
element.send_keys("搜索")

driver.get_screenshot_as_file("./img.png")

sleep(2)
driver.quit()

6、save_screenshot(filename)

该方法的用法和get_screenshot_as_file(filename)一致,源码中save_screenshot(filename) return的是get_screenshot_as_file(filename)。
在这里插入图片描述

import base64
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r"https://www.baidu.com"
driver.get(url)
driver.maximize_window()

element = driver.find_element(By.ID, "kw")
element.send_keys("搜索")

driver.save_screenshot("./img.png")

sleep(2)
driver.quit()

二、文件打开形式

在使用get_screenshot_as_png()、screenshot_as_png、get_screenshot_as_base64()和screenshot_as_base64进行截图时,需要将二进制数据进行进一步的处理,with open(“./img.png”, “wb”) as f 中”wb“的意思是以二进制形式写入。
下面介绍几种常见的文件打开形式:

1、基础模式

  • r:只读,以文本模式打开文件,文件不存在时会报错
  • w:写入,以文本模式打开文件,覆盖写入(清空原内容),文件不存在时会新建
  • a:追加,以文本模式打开文件,在文件末尾追加内容(不覆盖原内容),文件不存在时会新建

2、二进制模式

  • rb:二进制只读
  • wb:二进制写入(覆盖)
  • ab:二进制追加

3、读写组合模式

  • r+:文本读写,文件不存在时会报错,不会清空原内容,但是写入时会覆盖当前位置的内容
  • w+:文本读写,文件不存在时会新建,会清空原有内容
  • rb+ / wb+ / ab+ :对应的二进制读写模式

4、其他模式

  • x:独立创建,仅在文件不存在时创建并写入,否则报错(避免覆盖已有文件)。支持python、php、ruby语言。

三、文件路径

保存截图时,需要指定文件名及路径,如with open(“./img.png”, “wb”) as f 的”./img.png“表示将截图在当前路径下保存为img.png。

  • 当前路径:./
  • 上一级路径:…/

四、时间戳命名

保存截图时,如果想以当前时间命名,则需要使用到时间戳命名。

1、导包

from time import strftime

2、使用

driver.get_screenshot_as_file(“./%s.png” % (strftime(“%Y_%m_%d %H_%M_%S”)))

总结

在这里插入图片描述

<think>我们计划编写一个自动化巡检脚本,主要功能包括: 1. 登录Web系统 2. 对首页进行截图 3. 按日期保存截图 4. 通过网页展示图片 我们可以使用Python语言,结合Selenium进行Web自动化操作,并使用PIL或Selenium自带的截图功能。同时,我们需要一个简单的Web服务来展示截图,可以使用Flask框架。 步骤: 1. 安装必要的库:selenium, flask, pillow (PIL) 2. 使用Selenium控制浏览器(如Chrome)进行登录和截图。 3. 将截图按日期命名的格式保存到指定目录。 4. 使用Flask搭建一个简单的网页,列出所有截图并按日期排序展示。 注意:需要下载对应浏览器的驱动(如ChromeDriver)并放置在系统路径中。 详细步骤: 第一步:编写自动化截图脚本(例如:screenshot.py) - 使用Selenium打开浏览器,访问登录页面。 - 定位用户名和密码输入框,输入凭证,提交登录。 - 等待登录完成(可能需要等待页面跳转或某个元素出现)。 - 对首页进行截图。 - 将截图以当前日期(例如:2024-06-13.png)为文件名保存到指定目录(如:static/images)。 第二步:编写一个Flask应用(例如:app.py)来展示图片 - 设置一个路由,读取保存截图的目录,列出所有图片文件。 - 在网页上按日期倒序排列展示图片。 第三步:我们可以设置一个定时任务(如cron或Windows任务计划)来定期执行截图脚本。 代码示例: 1. 截图脚本(screenshot.py): 注意:需要根据实际的登录页面元素修改定位方式和等待条件。 ```python 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 import time import os from datetime import datetime # 创建保存截图的目录 save_dir = "static/images" os.makedirs(save_dir, exist_ok=True) # 使用Chrome浏览器 options = webdriver.ChromeOptions() options.add_argument('--headless') # 无头模式,不显示浏览器窗口 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') driver = webdriver.Chrome(options=options) try: # 打开登录页面 driver.get("http://example.com/login") # 替换为实际的登录页面URL # 定位用户名和密码输入框,并输入 username = driver.find_element(By.ID, "username") # 根据实际情况修改定位方式 password = driver.find_element(By.ID, "password") username.send_keys("your_username") password.send_keys("your_password") # 提交登录表单 submit_button = driver.find_element(By.ID, "submit") submit_button.click() # 等待登录成功,例如等待首页的某个元素出现 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "homepage_element")) ) # 等待一段时间确保页面加载完成 time.sleep(3) # 截图并保存 today = datetime.now().strftime("%Y-%m-%d") screenshot_path = os.path.join(save_dir, f"{today}.png") driver.save_screenshot(screenshot_path) print(f"截图已保存至: {screenshot_path}") finally: driver.quit() ``` 2. Flask应用(app.py): 创建一个简单的Flask应用,展示指定目录下的图片。 ```python from flask import Flask, render_template import os from datetime import datetime app = Flask(__name__) # 截图保存目录 SCREENSHOT_DIR = "static/images" @app.route('/') def index(): # 获取截图文件列表,按日期排序(最新的在前) files = os.listdir(SCREENSHOT_DIR) # 过滤出图片文件(按扩展名) image_files = [f for f in files if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))] # 按文件名(即日期)排序,从新到旧 image_files.sort(key=lambda x: datetime.strptime(x.split('.')[0], '%Y-%m-%d'), reverse=True) return render_template('index.html', images=image_files) if __name__ == '__main__': app.run(debug=True) ``` 3. 创建模板文件(templates/index.html): 在templates目录下创建index.html文件,内容如下: ```html <!DOCTYPE html> <html> <head> <title>巡检截图展示</title> </head> <body> <h1>巡检截图展示</h1> <ul> {% for image in images %} <li> <h2>{{ image.split('.')[0] }}</h2> <img src="{{ url_for('static', filename='images/' + image) }}" alt="{{ image }}" style="max-width: 100%;"> </li> {% endfor %} </ul> </body> </html> ``` 4. 目录结构: project/ ├── screenshot.py ├── app.py ├── static/ │ └── images/ # 截图将保存在这里 └── templates/ └── index.html 运行方式: - 首先运行截图脚本:python screenshot.py (可以设置为定时任务) - 然后运行Flask应用:python app.py - 访问 http://localhost:5000 查看截图 注意事项: - 需要根据实际登录页面修改元素定位方式(如ID、类名等)。 - 如果登录有验证码,需要额外处理(如人工介入或使用OCR,但可能不稳定)。 - 无头模式可能在某些网站上有不同的行为,需要测试。 - 确保WebDriver(如ChromeDriver)与浏览器版本匹配。 引用参考: - 使用Selenium进行Web自动化操作[^1]。 - 使用Flask搭建Web应用展示图片[^2]。 根据上述引用[4]中提到的自动化测试框架,我们这里采用的方法也是基于Web自动化的方式,通过Selenium模拟浏览器操作,实现登录和截图,然后通过自建Web服务展示截图。这种方式可以跨平台运行(Windows、Linux等)[^4]。 相关问题: 1. 如何设置定时自动执行截图脚本? 2. 如果登录页面有验证码怎么办? 3. 如何提高截图脚本的稳定性(例如网络波动导致加载失败)? 4. 如何扩展这个脚本以支持多个页面的巡检?</think>以下是一个完整的自动化巡检脚本解决方案,用于实现Web登录、首页截图、按日期保存截图并通过网页展示图片: ### 解决方案思路 1. 使用Python + Selenium实现Web自动化登录和截图 2. 按日期组织截图文件存储 3. 使用Flask搭建简易图片展示网页 4. 通过定时任务实现自动巡检 ### 完整代码实现 #### 1. 自动化截图脚本 (`screenshot.py`) ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import os import datetime from pathlib import Path # 配置参数 WEB_URL = "http://your-website.com/login" # 替换为实际登录URL USERNAME = "your_username" PASSWORD = "your_password" SCREENSHOT_DIR = "screenshots" # 创建截图目录 Path(SCREENSHOT_DIR).mkdir(parents=True, exist_ok=True) def capture_screenshot(): # 配置Chrome无头模式 chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=chrome_options) try: # 打开登录页面 driver.get(WEB_URL) # 等待元素加载 wait = WebDriverWait(driver, 20) username_field = wait.until(EC.presence_of_element_located((By.NAME, "username"))) password_field = wait.until(EC.presence_of_element_located((By.NAME, "password"))) submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))) # 输入凭证并登录 username_field.send_keys(USERNAME) password_field.send_keys(PASSWORD) submit_btn.click() # 等待登录成功(根据实际页面元素调整) wait.until(EC.url_contains("dashboard")) # 替换为登录后页面的关键URL # 添加额外等待确保页面完全加载 time.sleep(3) # 生成按日期的文件名 today = datetime.date.today().strftime("%Y-%m-%d") timestamp = datetime.datetime.now().strftime("%H-%M-%S") filename = f"{SCREENSHOT_DIR}/{today}/{timestamp}.png" # 创建日期目录 Path(f"{SCREENSHOT_DIR}/{today}").mkdir(exist_ok=True) # 保存截图 driver.save_screenshot(filename) print(f"截图已保存: {filename}") return filename except Exception as e: print(f"截图失败: {str(e)}") return None finally: driver.quit() if __name__ == "__main__": capture_screenshot() ``` #### 2. 图片展示网页 (`app.py`) ```python from flask import Flask, render_template import os from datetime import datetime app = Flask(__name__) SCREENSHOT_DIR = "screenshots" @app.route('/') def show_screenshots(): # 获取所有日期目录 dates = sorted([d for d in os.listdir(SCREENSHOT_DIR) if os.path.isdir(os.path.join(SCREENSHOT_DIR, d))], reverse=True) # 准备展示数据 screenshot_data = [] for date in dates: date_dir = os.path.join(SCREENSHOT_DIR, date) images = sorted([ { "path": f"{date}/{img}", "time": img.replace('.png', '') } for img in os.listdir(date_dir) if img.endswith('.png') ], key=lambda x: x["time"], reverse=True) if images: screenshot_data.append({ "date": date, "images": images }) return render_template('gallery.html', screenshots=screenshot_data) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` #### 3. 网页模板 (`templates/gallery.html`) ```html <!DOCTYPE html> <html> <head> <title>巡检截图展示</title> <style> .container { max-width: 1200px; margin: 0 auto; padding: 20px; } .date-section { margin-bottom: 40px; } .date-header { font-size: 24px; border-bottom: 2px solid #3498db; padding-bottom: 10px; margin-bottom: 20px; } .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; } .image-card { border: 1px solid #ddd; border-radius: 5px; overflow: hidden; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .image-card img { width: 100%; height: 200px; object-fit: cover; } .image-time { padding: 10px; background: #f5f5f5; text-align: center; font-size: 14px; } </style> </head> <body> <div class="container"> <h1>系统巡检截图展示</h1> {% for group in screenshots %} <div class="date-section"> <h2 class="date-header">{{ group.date }}</h2> <div class="image-grid"> {% for image in group.images %} <div class="image-card"> <img src="{{ url_for('static', filename='screenshots/' + image.path) }}" alt="巡检截图 {{ image.time }}"> <div class="image-time">{{ image.time.replace('-', ':') }}</div> </div> {% endfor %} </div> </div> {% endfor %} </div> </body> </html> ``` ### 部署和使用步骤 1. **安装依赖**: ```bash pip install selenium flask webdriver-manager ``` 2. **下载浏览器驱动**: - 安装对应浏览器的WebDriver(推荐Chrome) - 或使用`webdriver-manager`自动管理: ```python from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) ``` 3. **配置参数**: - 修改`WEB_URL`、`USERNAME`、`PASSWORD`为实际登录信息 - 根据需要调整等待时间和元素定位方式 4. **目录结构**: ``` project/ ├── screenshots/ # 截图存储目录 ├── templates/ │ └── gallery.html # 展示网页模板 ├── screenshot.py # 截图脚本 └── app.py # Flask应用 ``` 5. **运行系统**: - 手动执行截图脚本:`python screenshot.py` - 启动展示网站:`python app.py` - 访问 `http://localhost:5000` 查看截图 6. **设置定时任务**: - Linux (cron): ```bash crontab -e # 每天9点执行 0 9 * * * /usr/bin/python3 /path/to/screenshot.py ``` - Windows (任务计划程序): 创建每天执行`python screenshot.py`的计划任务 ### 技术要点说明 1. **Selenium自动化**: - 使用无头Chrome模式节省资源 - 显式等待确保元素加载完成 - 智能定位登录表单元素 2. **文件管理**: - 按日期创建目录:`screenshots/YYYY-MM-DD/` - 文件名包含时间戳:`HH-MM-SS.png` 3. **网页展示**: - Flask轻量级Web框架 - 响应式网格布局展示图片 - 按日期分组排序截图 4. **错误处理**: - 异常捕获防止脚本中断 - 页面加载状态检测 - 目录自动创建机制 ### 优化建议 1. **安全增强**: - 将凭证存储在环境变量中 - 添加HTTPS支持 - 实现基本身份验证 2. **功能扩展**: ```python # 在capture_screenshot()中添加 # 页面健康检查 if "Error" in driver.title: send_alert_email("页面异常") # 多页面截图 pages = ["/dashboard", "/status", "/reports"] for page in pages: driver.get(WEB_URL + page) # 单独截图... ``` 3. **部署优化**: - 使用Docker容器化部署 - 添加Nginx反向代理 - 集成到Jenkins流水线 此方案实现了完整的自动化巡检流程,每日截图将按日期组织,并通过网页直观展示,方便运维人员快速查看系统状态历史记录[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值