安装
安装selenium模块
pip install selenium
下载geckodriver
Firefox版下载地址
如果网站没法访问,那就得想特殊方法了,
下载下来是个这玩意
找到python.exe文件
把上一步下载好的geckodriver.exe文件和python.exe放到一起
一个自动打卡截图应用实例
需求描述
因为疫情影响,不能返校,于是每天在家都需要健康打卡并且把打卡记录截图发送到qq群里, 这种机械的任务时间一久就让人感到厌烦,于是想到用python+selenium自动化完成这一切。
解决思路
工作分为三步
- 打卡
- 截图
- 发送qq消息*
具体内容
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.keys import Keys
from PIL import ImageGrab
import time
from PIL import Image
from io import BytesIO
import win32clipboard
import os
# import win32gui
# import win32con
id = '' # 自己的学号
paword = '' # 密码
firefox_options = Options()
firefox_options.add_argument('--headless') # 静默启动浏览器
print("正在启动浏览器,请稍等")
driver = webdriver.Firefox(options=firefox_options)
driver.get("http://login.cuit.edu.cn/Login/xLogin/Login.asp")
print("已打开学校网页")
userName = driver.find_element_by_class_name("TxtUserNameCssClass")
userName.send_keys(id)
print("已输入账号:%s" % id)
password = driver.find_element_by_class_name("TxtPasswordCssClass")
password.send_keys(paword)
print("已输入密码,正在登录")
enterButton = driver.find_element_by_class_name("IbtnEnterCssClass").click()
time.sleep(4) #很关键的一点,在网页没有加载完全时是找不到下面元素的
first = driver.find_element_by_partial_link_text("师生")
print("正在打开网页:%s" % first.text)
first.click()
time.sleep(1)
home_status = driver.find_element_by_xpath('//select[@name="sF21650_5"]/option[@value=1]')
print("现居住地状态:%s" % home_status.text)
home_status.click()
work_status = driver.find_element_by_xpath('//select[@name="sF21650_6"]/option[@value=5]')
print("今天工作状态:%s" % work_status.text)
work_status.click()
health_status = driver.find_element_by_xpath('//select[@name="sF21650_7"]/option[@value=1]')
print("个人健康状态:%s" % health_status.text)
health_status.click()
lift_status = driver.find_element_by_xpath('//select[@name="sF21650_8"]/option[@value=1]')
print("个人生活状态:%s" % lift_status.text)
lift_status.click()
positive_status = driver.find_element_by_xpath('//select[@name="sF21650_9"]/option[@value=1]')
print("家庭成员状况:%s" % positive_status.text)
positive_status.click()
summit = driver.find_element_by_xpath('//input[@value="提交打卡"]').click()
time.sleep(1)
driver.switch_to.alert.accept() # 处理js弹窗
print("正在截图")
driver.execute_script("document.body.style.transform='scale(0.8)'") # 缩放浏览器以截得所有屏幕内容
driver.execute_script('window.scrollTo(0,83)') # 模拟鼠标滚动,目的同上
driver.get_screenshot_as_file("text.png")
print("截图完成")
driver.close()
print("浏览器已关闭")
# 将截图放于剪贴板
image = Image.open("text.png")
output = BytesIO()
image.save(output, 'BMP')
data = output.getvalue()[14:]
output.close()
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
win32clipboard.CloseClipboard()
print("截图已放于剪贴板")
if os.path.exists("text.png"):
os.remove("text.png")
print("截图已删除")
# 发送qq消息
# to_who = "TROTS"
# qq = win32gui.FindWindow(None, to_who)
# win32gui.SendMessage(qq, 258, 22, 2080193)
# win32gui.SendMessage(qq, 770, 0, 0)
# win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.SendMessage(qq, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
# print("消息已通过qq发送到%s"%to_who)
注:关于发送qq消息为什么给注释了?这个东西其实局限性还是挺大的,通俗地说它采用的原理是检测窗口的名称(当然这么说并不准确,先这么理解吧,能理解这个问题就行),所以我们必须要手动把这个窗口打开,使它成为一个独立的窗口,才可以实现发送消息,因为这个过程确实不太符合我们简化整个流程的最初目的,所以暂时先不加这个。
用到的一些知识
xpath教程
弹窗怎么解决
switch_to_alert
如何保存截图
如何缩放浏览器
模拟鼠标
鼠标键盘事件
Window.scrollTo()
selenium静默启动浏览器
selenium静默启动浏览器
python3将图片复制到剪贴板
使用python发送qq消息
No module named 'pip’解决方法
No module named 'pip._internal’解决方法
PIL安装失败解决方法
win32clipboard安装出错解决方法
selenium文档