准备

selenium模块,chrome,对应chrome版本的chromedriver,一台服务器

脚本功能

首先在登录页面登录,然后点击提交健康报告的链接跳转到提交页面,最后点击提交按钮,成功后再点击确认。

代码

首先放上完整代码

from selenium import webdriver
import time
username = 'xxx'        #你的用户名
password = 'xxx'        #你的密码
url = 'xxx'            #你的签到网站
driver = webdriver.Chrome()
driver.get(url)        #控制浏览器打开url
time.sleep(3)        #等待页面加载3秒,很重要
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[1]/div[2]/input').send_keys(username)        #找到username位置,并把用户名输进去
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[2]/div[2]/input').send_keys(password)        #找到password位置,并把密码输进去
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/button').click()        #点击登录按钮
time.sleep(3)        #等待页面加载3秒,很重要
driver.find_element_by_xpath('/html/body/div[1]/div[3]/div/ul/li[2]/a').click()        #点击提交健康报告的链接
time.sleep(3)        #等待页面加载3秒,很重要
driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[2]/button').click()        #点击提交按钮
time.sleep(3)        #等待页面加载3秒,很重要
driver.find_element_by_xpath('/html/body/div[4]/div[3]/a').click()        #点击确认按钮
driver.close()        #关闭浏览器

注意点

先说我觉得最重要的一点

time.sleep(3)        #等待页面加载3秒,很重要

等待加载很重要!等待加载很重要!等待加载很重要!重要事情说3遍!
不加这句代码可能会导致页面没加载出来就去定位元素,结果当然是找不到元素,而你还不知道到底哪里出问题了(别问我怎么知道的,说多了都是泪(ノ`Д´)ノ)

然后解释下这个

driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[1]/div[2]/input').send_keys(username)

这是根据xpath路径找到对应的元素,中间双引号里的东西就是xpath路径
下面以chrome为例演示如何找到xpath路径

在网页输入框点击右键->检查

在这里插入图片描述

然后Copy XPathCopy full XPath

在这里插入图片描述

按钮和链接位置也是通过这样定位

改进

上述脚本的运行是有界面模式,就是运行是会跳出浏览器界面然后进行一系列操作,而现在我们需要一个无界面模式运行的脚本,这样才能放在服务器上定时运行,从而真正实现自动提交功能。所以对脚本稍作改进。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
username = 'xxx'
password = 'xxx'
url = 'xxx'
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('window-size=1920x3000')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--hide-scrollbars')
chrome_options.add_argument('blink-settings=imagesEnabled=false')
chrome_options.add_argument('--headless')
driver=webdriver.Chrome(options=chrome_options)
driver.get(url)
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[1]/div[2]/input').send_keys(username)
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/li[2]/div[2]/input').send_keys(password)
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/ul/button').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[1]/div[3]/div/ul/li[2]/a').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[2]/button').click()
time.sleep(3)
if driver.find_element_by_xpath('/html/body/div[4]/div[3]/a'):
    driver.find_element_by_xpath('/html/body/div[4]/div[3]/a').click()
    print("success")
driver.close()

在这里插入图片描述

运行没问题,接下来就是对服务器的一些操作了

定时运行

首先服务器也得装好这一系列环境(selenium模块,chrome,对应chrome版本的chromedriver)
然后脚本放到服务器上后再对其中的一行代码修改一下

把下面这行
driver=webdriver.Chrome(options=chrome_options)
改为
driver=webdriver.Chrome(r'/root/chromedriver',options=chrome_options)
其中/root/chromedriver是chromedriver在服务器中的路径,比如我装在root目录下,所以就是/root/chromedriver

最后一步,通过crontab命令设定定时任务

crontab -e   #进入编辑

命令格式为* * * * * python路径 脚本路径
比如我的就是

01 0 * * * /usr/bin/python /www/wwwroot/submit/submit.py        #代表每天00:01运行这个脚本

编辑完后,Ctrl+O和Ctrl+X保存并退出,退出后可以用crontab -l查看定时任务

ps:没有服务器的小伙伴可以用windows的定时任务,不过这样电脑就得一直开着了,这里我不再阐述

结尾

脚本很简单,但作为一个连python都不大会的小菜鸡第一次搞这个,出现了好多问题,可又不知道错哪了,怎么改,卡了好久,每一步都搞的很艰难,好在功夫不负有心人,没日没夜搞了几天后终于成功了(好吧,稍微夸张了一点,但确实搞挺久的)
此脚本应该能适用于大部分网站,大家在使用的时候只需要照着这模板修修改改xpath就行了。

觉得不错的话帮我github上点个星星吧o(〃‘▽’〃)o
https://github.com/xiaolong22333/autosubmit