百木园-与人分享,
就是让自己快乐。

自动化终端考核检查系统的搭建过程

自从2020年进入公司从学生变成社会人以来,接手的第一项工作就是检查并整改公司终端的季度考核指标;

季度考核是公司总部要求的,每季度一次(废话。。),需要管理的终端量在1500台左右;

主要就是检查内网终端各类管理软件(桌面管理、防病毒等等)的安装率与版本合规情况;

各类软件都有总部提供的平台,需要做的就是去各个平台导出数据、Excel汇总计算,

然后看看哪项考核不达标,通知负责终端维护的外包公司去各个地点做维护;

这项工作虽然不难,但是每季度末都要重复地检查确保达标,因此工作量很大,每天至少要花一两个小时;

其实在刚接手的时候就有做一个自动检查系统的想法,奈何当时的我技术力还不够;

并且刚刚进入公司需要学习的东西太多,就暂且搁置了;

22年一季度不是很忙,就利用工作之余的上班时间做出来了;

每天自动出结果发给外包公司,很大程度上减少了季度考核时的工作量;

主要的实现过程大致是三个步骤:

一、利用Python的selenium WEB自动化工具去各个平台下载数据;

二、利用Python的pymysql数据库工具将数据文件导入MySQL数据库;

三、MySQL数据库按照考核标准计算结果,生成结果文件,再通过邮件发送结果文件。

结构图:


一、利用Python的selenium WEB自动化工具去各个平台下载数据

其实用浏览器控制去导数可靠性比较差,并且效率比较低,但是去找各个平台的项目组对接数据库实在太麻烦了,人家也不见得乐意开放数据库给你用;

并且这个工具最多季度末的时候一天跑两三次,并不需要太高的效率,所以就采用了selenium WEB自动化;

selenium的学习参考的是腾讯云社区的教程:Python中Selenium库使用教程详解 - 云+社区 - 腾讯云 (tencent.com);

首先是pip安装selenium,指定国内源加快下载速度:

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

我用的是谷歌浏览器版本99,需要下载一个对应版本99的驱动程序才能调起浏览器,下载地址:http://chromedriver.storage.googleapis.com/index.html;

使用示例:

from selenium import webdriver
from time import sleep

# 实例化一款浏览器
browser = webdriver.Chrome(executable_path = \"chromedriver.exe\")
# 对指定的url发起请求
browser.get(\"https://www.bilibili.com/\")
# 设定窗口大小
browser.set_window_size(1600, 900)
# 在页面中寻找元素
element = browser.find_element_by_xpath(\'/html/body/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div/div/span\') # “登录”
# 对元素进行操作
element.click() # 点击
# 延时3秒,等待页面回应
sleep(3)
# 关闭浏览器
browser.quit()

一般浏览器都可以用F12进入开发工具查看页面中的元素,点击1处的工具,再点击2处页面中任意的元素,在3处会跳转并高亮元素在HTML代码中的位置;

我是按照完整xpath来寻找元素的browser.find_element_by_xpath(),也可以使用元素的id、name、标签等等;

点击元素后element.click(),如果有后续操作可以添加一个延时,否则页面可能来不及响应。

1. 切换frame

某些页面会用到frame的结构,比如:

<html lang=\"en\">
<head>
    <title>FrameTest</title>
</head>
<body>
<iframe src=\"a.html\" id=\"frame1\" name=\"myframe\"></iframe>
</body>
</html>

在frame中的元素无法被browser.find_element_by_xpath()直接寻找到,需要进行frame的切换:

frame = browser.find_elements_by_tag_name(\'iframe\')[1] # 切换frame
browser.switch_to.frame(frame)
element = browser.find_element_by_xpath(\'XXXXXX\') # 寻找frame中的元素
element.click()
browser.switch_to.default_content() # 退出frame回到主体结构

如果需要回到主体结构继续操作要使用browser.switch_to.default_content()

2. 切换浏览器窗口

某些地方点击后会新建标签页或者弹出新的浏览器窗口,此时就需要切换窗口去继续操作:

windows = browser.window_handles
browser.switch_to.window(windows[1]) # 打开了新页面,需要切换窗口
element = browser.find_element_by_xpath(\'XXXXXX\')
element.click()

3. 新建标签页

如果不想关闭浏览器,需要打开新的标签页继续操作:

js = \"window.open(\'https://www.douban.com/\')\"
browser.execute_script(js) # 在新标签页中访问

4. 识别简单的验证码

本来我以为用selenium查找元素一个一个去点是很重复无聊且枯燥的工作;

直到我遇到了一个平台登录的时候需要输入一个图片验证码(其他平台都是只需要账号密码),事情突然变得有趣了起来;

大概的思路是先截取验证码的图片,然后用图片识别文字的工具来识别验证码,再输入到网页验证码框里;

首先要解决把验证码图片截出来的问题,我参考的是selenium验证码识别之局部截图 - 简书 (jianshu.com);

然后选择了一个比较轻量的(因为要放到内网,太大了不好处理)图片识别文字的工具——pytesseract;

from selenium import webdriver
from time import sleep
from PIL import Image
import pytesseract

# 重复尝试识别验证码,失败后刷新重试,成功后寻找不到try部分中第一个元素,跳转到finally部分
try:
    r = 0
    while True:
        # 输入用户名密码,识别验证码,点击“登录”
        element = browser.find_element_by_xpath(\'XXXXXX\') # 用户名
        element.send_keys(\'用户名\')
        element = browser.find_element_by_xpath(\'XXXXXX\') # 密码
        element.send_keys(\'密码\')
        # 截图识别验证码并输入
        browser.save_screenshot(\'browser.png\') # 对网页进行截图
        code_png_lel = browser.find_element_by_xpath(\'XXXXXX\') # 验证码
        location = code_png_lel.location # 获取验证码元素所在位置
        print(\'location\', location)
        size = code_png_lel.size # 获取验证码元素大小
        print(\'size\', size)
        rangle = (int(location[\'x\']), int(location[\'y\']), int(location[\'x\'] + size[\'width\']), int(location[\'y\'] + size[\'height\'])) # 找到验证码在网页截图中的位置
        print(\'rangle\', rangle)
        i = Image.open(\'browser.png\')
        frame = i.crop(rangle) # 按照验证码位置截图
        frame.save(\'code.png\')
        j = Image.open(\'code.png\')
        string = pytesseract.image_to_string(j) # 识别验证码图片中的文字
        string = string.replace(\' \', \'\') # 删除识别结果中的空格
        print(string)
        element = browser.find_element_by_xpath(\'XXXXXX\') # 验证码输入框
        element.send_keys(string) # 输入删除空格后的识别结果
        element = browser.find_element_by_xpath(\'XXXXXX\') # “登录”
        element.click() # 点击登录
        browser.refresh() # 刷新页面
        r = r + 1
        print(r)
finally:
    # 成功后跳出循环,继续操作
    sleep(5)
    element = browser.find_element_by_xpath(\'XXXXXX\')
    element.click()

 

 

 

 


未完待续。。。

 


来源:https://www.cnblogs.com/BTday/p/16117880.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 自动化终端考核检查系统的搭建过程

相关推荐

  • 暂无文章