树莓派Ubuntu系统无GUI 利用python+selenium+chrome实现自动健康打卡

https://www.yrblog.cn/2019/09/15/raspberrypiuseselenium/主要参考这个
https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+packageschorme arm64 下载地址

一.环境搭建

我使用的是树莓派4B 安装的Ubuntu mate18.04,没有外接显示屏,纯当服务器使用

1安装selenium

pip install selenium #直接使用pip安装

2安装chrome

试了很多次都安装失败,搜索资料后发现chromedriver早就不支持arm架构系统了,于是在上述参考网站上找到了解决办法:

不带桌面系统的安装仍然需要下载上文说的到的文件,但在安装之前需要先安装xvfb,apt-get install xvfb ,接下来按照上文操作即可。

所以首先安装xvfb

sudo apt install xvfb

然后到在开头的chrome资源网站https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+packages下载以下内容:

chromium-browser_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb (43.1 MiB)
chromium-chromedriver_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb (2.7 MiB)
chromium-codecs-ffmpeg-extra_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb (883.5 KiB)
chromium-codecs-ffmpeg_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb (631.3 KiB)

版本无所谓,名字要对上;
下载完成后先安装chromium-codecs-ffmpeg-extra与chromium-codecs-ffmpeg,接下来安装chromium-browser,最后安装chromium-chromedriver。安装完成后的chromedriver地址为/usr/lib/chromium-browser/chromedriver,在程序中引入即可,或者加入系统变量。
安装命令为sudo dpkg -i *.deb

二、编写打卡程序

编写程序时其他都能搜到资料,有两点折磨我半天
可以参考官方教程Selenium 浏览器自动化项目
好像被墙了,自行解决

1.网页跳转

网页跳转分两种
一是直接开一个新标签,这样可以用 all_pages=driver.window_handles
获取全部句柄,通过句柄切换函数(此处下面讲)即可;
二是网页内跳转,并没有多出来新句柄,只能使用inframe的方式,此时一定要用F12仔细寻找inframe的标签,我当时就没找到耽误了很长时间

2.句柄切换函数

网上的资料大部分都是这样写的:

driver.switch_to_window()

然而在我写时这个函数不能使用,推荐使用新的句柄切换函数

driver.switch_to.window(window_handle)

3.源代码

电脑端程序

from selenium import webdriver
from msedge.selenium_tools import Edge , EdgeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
#用户信息
uuid="" #学号
pasw="" #密码
url="https://jksb.v.zzu.edu.cn/vls6sss/zzujksb.dll/first0" #打卡网址
massage=["郑州大学统一身份认证平台","郑州大学数据中台2020"] #网页title

driver=Edge()
driver.get(url)
print("开始打开网址...")
if(driver.title == massage[0]):
    print("打开网页成功")
else:
    print("打开网页失败")
    driver.quit()
print("已进入",driver.title)
driver.find_element_by_xpath("//*[@id='mt_5']/div[2]/div[3]/input").send_keys(uuid)
print("输入学号:",uuid)
driver.find_element_by_xpath("//*[@id='mt_5']/div[3]/div[3]/input").send_keys(pasw)
print("输入密码:",pasw)
driver.find_element_by_xpath("//*[@id='mt_5']/div[5]/div/input").click()
time.sleep(1)
print("开始跳转页面")
if(driver.title == massage[1]):
    print("登录成功")
else:
    print("登录失败")
    driver.quit()

print("已进入",driver.title)
time.sleep(3)
driver.switch_to.frame('zzj_top_6s')
text=driver.find_element_by_xpath("//*[@id='bak_0']/div[7]/span").text
print(text)
if text == "今日您已经填报过了":
    driver.find_element_by_xpath("//*[@id='bak_0']/div[13]/div[5]/div[2]/span").click()
    print("你取消了本次健康状况填报")
else:
    driver.find_element_by_xpath("//*[@id='bak_0']/div[13]/div[5]/div[4]/span").click()
    time.sleep(1)
    driver.find_element_by_xpath("//*[@id='bak_0']/div[11]/div[4]").click()
    time.sleep(1)
    print(driver.find_element_by_xpath("//*[@id='bak_0']/div[2]/div[2]/div[2]/div[2]").text)
    driver.find_element_by_xpath("//*[@id='bak_0']/div[2]/div[2]/div[4]/div[2]").click()
    time.sleep(1)
    if driver.find_element_by_xpath("//*[@id='bak_0']/div[2]").text == "已完成今日健康状况上报":
        print("已完成今日健康状况上报")
    else:
        print("打卡失败")
    driver.save_screenshot("result.png")
time.sleep(200)
driver.quit()

移植到树莓派上

from selenium import webdriver
import time
import sys

#sys.path.append('/home/ubuntu/Python/mail') 自己写的发送邮件的包
#from sendemail import SendEmail,SendFile

#用户信息
uuid="" #学号
pasw="" #密码
url="https://jksb.v.zzu.edu.cn/vls6sss/zzujksb.dll/first0" #打卡网址
massage=["郑州大学统一身份认证平台","郑州大学数据中台2020"] #网页title

options=webdriver.ChromeOptions()
options.add_argument('-headless')
options.add_argument('-disable-gpu')
options.add_argument('-no-sandbox')
driver=webdriver.Chrome(options=options)
driver.get(url)
print("开始打开网址...")
if(driver.title == massage[0]):
    print("打开网页成功")
else:
    print("打开网页失败")
    driver.quit()
print("已进入",driver.title)
driver.find_element_by_xpath("//*[@id='mt_5']/div[2]/div[3]/input").send_keys(uuid)
print("输入学号:",uuid)
driver.find_element_by_xpath("//*[@id='mt_5']/div[3]/div[3]/input").send_keys(pasw)
"daka.py" [只读][dos] 73L, 2538C                                                                      1,1          顶端
driver=webdriver.Chrome(options=options)
driver.get(url)
print("开始打开网址...")
if(driver.title == massage[0]):
    print("打开网页成功")
else:
    print("打开网页失败")
    driver.quit()
print("已进入",driver.title)
driver.find_element_by_xpath("//*[@id='mt_5']/div[2]/div[3]/input").send_keys(uuid)
print("输入学号:",uuid)
driver.find_element_by_xpath("//*[@id='mt_5']/div[3]/div[3]/input").send_keys(pasw)
print("输入密码:","*******")
driver.find_element_by_xpath("//*[@id='mt_5']/div[5]/div/input").click()
time.sleep(1)

print("开始跳转页面")
if(driver.title == massage[1]):
    print("登录成功")
else:
    print("登录失败")
    driver.quit()
    exit(-1)
print("已进入",driver.title)
time.sleep(1)
driver.switch_to.frame('zzj_top_6s')
text=driver.find_element_by_xpath("//*[@id='bak_0']/div[7]/span").text
print(text)
flag=0
if text == "今日您已经填报过了":
    driver.find_element_by_xpath("//*[@id='bak_0']/div[13]/div[5]/div[2]/span").click()
    print("你取消了本次健康状况填报")
    flag=1
else:
    driver.find_element_by_xpath("//*[@id='bak_0']/div[13]/div[5]/div[4]/span").click()
    time.sleep(1)
    driver.find_element_by_xpath("//*[@id='bak_0']/div[11]/div[4]").click()
    time.sleep(1)
    print(driver.find_element_by_xpath("//*[@id='bak_0']/div[2]/div[2]/div[2]/div[2]").text)
    driver.find_element_by_xpath("//*[@id='bak_0']/div[2]/div[2]/div[4]/div[2]").click()
    time.sleep(1)
    if driver.find_element_by_xpath("//*[@id='bak_0']/div[2]").text == "已完成今日健康状况上报":
        driver.save_screenshot("result.png")
        flag=2
    else :
        flag=0
 '''
if flag == 2:
    ret=SendFile("result.png")
    print("已完成今日健康状况上报")
elif flag == 1:
    ret=SendEmail("Ubuntu自动通知","今日您已经填报过了")
else :
    ret=SendEmail("Ubuntu自动通知","打卡失败")
 '''
time.sleep(1)
driver.quit()
exit(0)

你可能感兴趣的:(Ubuntu,网页自动化,selenium,python,ubuntu)