准备
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 XPath
或Copy 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
2 条评论
我记得是不是有个可以检测加载完毕的函数的,可以试试
哦哦,感谢提醒,因为没接触过,也不知道有这种函数 :qwq11: