让 Python 做日常工作 使用 Selenium 自动化考勤处理

介绍

本文介绍了一种在考勤管理系统中实现日常考勤输入自动化日常工作自动化的方法。

通过将考勤录入等日常工作自动化,减少日常考勤录入所需的时间。它还可以防止输入遗漏和输入错误,并消除处理输入错误的需要,减少不必要的压力。

概述

本文介绍的考勤自动化处理环境如下。

操作系统是 macOS,但在 Windows 的情况下,可以使用任务计划程序构建类似的机制。

物品 版本等 操作系统 苹果系统 Python 3.8 硒 4.4 浏览器 铬合金

考勤处理的自动化是通过以下机制实现的。由于在家办公和去办公室的考勤处理是不同的,所以基本上都是在完全远程办公的前提下,设置为在家办公时处理。

通过 cron 启动 shell 脚本 使用 shell 脚本确定是否在家工作 如果您在家工作,请启动 Python 程序 使用 Selenium 输入出勤率 执行

Python 程序创建并运行一个虚拟环境。

创建虚拟环境并安装 Selenium

Python的虚拟环境是venv创建使用

要创建虚拟环境,请运行以下命令。为<Dir> 指定任何目录名称。

$ python3 -m venv <Dir>$ source <Dir>/bin/activate

搭建虚拟环境后,硒安装如果启用了虚拟环境,提示将发生变化。例如,如果kintai 目录有效,则输出如下。

(kintai) $ pip3 install selenium

如果pip版本老出现如下错误,请升级pip。

$ pip3 install --upgrade pip

错误输出示例
Failed to build cryptography
ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly
WARNING: You are using pip version 19.2.3, however version 22.2.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
驱动下载

不能仅使用已安装的 Selenium。您需要安装支持您的浏览器的驱动程序。

启动 Chrome 并转到 chrome://settings/help 以检查版本。

检查版本后,从下载相同版本的 ChromeDriver 并将其部署到任何目录。

如果升级浏览器版本,还需要升级驱动程序版本以实现兼容性。

以下是由于浏览器版本和驱动程序版本不同而发生错误的输出示例。

错误输出示例
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 103
Current browser version is 105.0.5195.52 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

下面是使用 Selenium 登录网站的过程片段。这是一个示例,因为 URL 和操作浏览器需要获取的元素因使用的考勤系统而异。

#! /usr/bin/env python3
import datetime
import time
import traceback

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select

USERID= os.environ['USERID']
PASS = os.environ['PASS']

driver = '/opt/chrome/chromedriver'
options = webdriver.chrome.options.Options()
browser = webdriver.Chrome(executable_path=driver, chrome_options=options)

base_url = 'https://<勤怠システムのURL>/'

# USERIDとPASSを入力して、ログインボタンを押す場合の例
try:
    browser.get(base_url + '<ログインページを指定>')

    e = browser.find_element(By.ID, '<IDの要素を指定>')
    e.clear()
    e.send_keys(USERID)

    e = browser.find_element(By.ID, '<パスワードの要素を指定>')
    e.clear()
    e.send_keys(PASS)

    e.find_element(By.XPATH, '<XPATHを指定>').click()
    time.sleep(3)

except Exception as e:
    traceback.print_exc()

用于登录考勤管理系统的 ID 和密码凭据作为环境变量包含在内,以避免硬编码。设置环境变量将在后面描述。

硒版

2021 年 10 月 13 日硒 4已宣布。在撰写本文时,4.4.x 是最新的。

Selenium 4 的主要变化是您可以从

例如,find_element_by_id 方法用于通过指定其 ID 属性来检索元素。在 Selenium 4 中,它已更改为以下书写样式。

# Selenium 3
find_element_by_id('<要素名>')
# Selenium 4
find_element(By.ID, '<要素名>')

旧书和博客包含大量有关如何编写 Selenium 3 的信息,因此在将其用作参考时要小心。

如何使用硒

使用 Selenium 操作浏览器的基本用法如下所述。有关浏览器操作的详细信息,请参阅文档您可以从

在本文中,通过结合以下浏览器操作来实现自动化。

启动浏览器
base_url = "<勤怠システムのURL>"
browser.get(base_url) 
启动浏览器(无头模式)
options = webdriver.chrome.options.Options()
options.add_argument('--headless')

browser = webdriver.Chrome(executable_path="/opt/chrome/chromedriver", chrome_options=options)
获取 元素并输入
e = browser.find_element(By.ID, 'USER_ID')
e.send_keys(USERID)
单击 按钮
browser.find_element(By.XPATH, '<XPATHを指定>').click()
指定查询参数
import datetime

today_tmp = datetime.date.today()
YEAR = today_tmp.strftime('%Y') 
MONTH = today_tmp.strftime('%m') 
DAY = today_tmp.strftime('%d') 

# 今日の日付にアクセス
base_url = 'https://<勤怠システムのURL>'
e = browser.get(base_url + f'<特定のページ>.php?D_YEAR={YEAR}&D_MONTH={MONTH}&D_DAY={DAY}')
指定选择框
e = browser.find_element(By.XPATH, '<XPATHを指定>')
select_object = Select(e)
select_object.select_by_index(3)

由于选择框是从 0 开始的,所以如果要获取第 4 个作为例子,索引选择 3。

退出浏览器
browser.quit()
自动化

利用操作系统功能构建自动化机制。

外壳脚本

cron 将在下班后启动 shell 脚本。

登录考勤管理系统的ID和密码凭证为export作为环境变量。

考勤系统的密码为security find-generic-password命令(-a为账户名,-s为keychain项名),获取mac keychain中注册的密码。

要确定您是否在家工作,请执行networksetup 命令获取连接的 Wi-Fi 的 SSID,如果 SSID 是家,则执行 Python 程序。networksetup 命令是用于在系统偏好设置中设置网络的命令。

#!/bin/bash

export USERID=********
export PASS=$(security find-generic-password -a "${USERID}" -s kintai -w)

network=$(networksetup -getairportnetwork en0 | awk '{print $4}')
home_ssid=********

DIR=$(cd $(dirname $0) && pwd)

if [ "${network}" = "${home_ssid}" ] ; then
        echo "勤怠処理開始"
        source "${DIR}"/bin/activate
        python3 "${DIR}"/kintai.py
fi

我认为在脚本结束后使用say 命令添加语音也很好。say 命令可以设置各种声音。

$ say -v Samantha -r 50 "thank you for your hard work"

钥匙串注册

使用以下步骤预先注册钥匙串。

启动钥匙串访问并创建一个新项目。

输入考勤系统中使用的 ID 和密码,然后按添加。

输入您的密码,然后按更改钥匙串。

选择创建的项目并双击或右键单击并按“获取信息”。

要允许从 shell 脚本访问,请在访问控制中选中“允许所有应用程序使用此项目”,然后按“保存更改”。

我试图通过从 Keychain Access 获取密码并将它们作为环境变量导入来避免对密码进行硬编码。当您更改密码时,您可以更改钥匙串访问值,而无需修改您的代码。

cron

设置cron自动启动并设置访问权限。

crontabs

基本上,我平日只从周一到周五工作,所以在19:00输入考勤时,将crontab设置如下。由于执行 cron 时的 PATH 有限,因此添加了所需的最小 PATH。

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
00 19 * * 1-5 /Users/workman/Documents/kintai/shell.sh
设置 cron 的权限

您还需要为 cron 启动的 shell 脚本设置权限。如果没有权限,会输出如下错误。

/bin/bash: /Users/workman/Documents/kintai/hell.sh: Operation not permitted

启动“系统偏好设置”,在“安全和隐私”的“隐私”中选择“全盘访问”,然后按“+”。

如果要添加 cron,请使用 command+shift+G 打开文件夹位置选择对话框,输入 /usr/sbin/cron 并按 Go。

选择 cron 并按“打开”。

选择了 cron。

每次运行 cron 时,它都会在控制台中打印以下内容:

You have mail in /var/mail/<user name>

从上面的输出,可以参考下面的文件来确认cron的结果。

cat /var/mail/<user name>

cron 执行结果示例
勤怠処理開始
/Users/workman/Documents/kintai/kintai.py:19: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  browser = webdriver.Chrome(executable_path=driver, chrome_options=options)
/Users/workman/Documents/kintai/kintai.py:19: DeprecationWarning: use options instead of chrome_options
  browser = webdriver.Chrome(executable_path=driver, chrome_options=options)
勤怠処理終了

在 Python 的情况下,通过设置 try/except 并执行错误处理,可以在程序异常终止时捕获异常。

综上所述

自动化日常工作所带来的时间收益是无法估量的。由于它是自动化的,因此无需执行进入考勤的行为。此外,由于缺少考勤输入等而导致的烦人通知不再出现,所以它是一石二鸟。

作为操作方面要记住的一点,如果工作在 cron 启动之前完成,则没有恢复机制,因此***准备一个可以按需执行的机制。

可以通过直接执行shell或者用别名设置命令来执行,但是在Mac的情况下,我认为更容易将它与Automator结合起来,使其成为一个应用程序,使其成为一个只需点击的机制。

对于 Automator,请参阅 Lifehack 以轻松更改我之前编写的 Mac 上的显示布局。

参考

*从隐藏的浏览器开始

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626083.html

66人参与, 0条评论 登录后显示评论回复

你需要登录后才能评论 登录/ 注册