selenium网页自动登录、打卡(一)


一、Python+Selenium

Selenium 是一个用电脑模拟人操作浏览器网页,可以实现自动化的工具,估计很多小伙伴在学python的时候有所了解。安装的步骤也很简单:

pip install selenium
#如果不行,就
sudo pip install selenium
#如果还不行,就
pip3 install selenium
#就
sudo pip3 install selenium

除了安装库之外,还要有selenium程序启动的浏览器,因此程序运行环境须要提前安装firefox浏览器和下载geckodriver

wget https://github.com/mozilla/geckodriver/releases/download/v0.22.0/geckodriver-v0.22.0-linux64.tar.gz
各个版本的driver下载地址如下
https://github.com/mozilla/geckodriver/releases
tar zxvf geckodriver-v0.22.0-linux64.tar.gz
mv geckodriver /usr/local/bin

二、使用步骤

1.引入库

代码如下:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

2.程序流程

  • 打开网页;
  • 识别出账号和密码框的位置并输入账号密码;
  • 模拟点击登录
  • 模拟点击打卡

3.具体代码

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains

class LoginUrl(object):
	#初始化类的属性
	def __init__(self, driver, url, username, password):
		self.__driver = driver
		self.__url = url
		self.__username = username
		self.__password = password
	#打开网页的方法
	def openwebsite(self):
		self.__driver.maximize_window()
		self.__driver.get(self.__url)
	#输入网页账号
	def inputusername(self, find_element_method, element):
		if(find_element_method == "id"):		
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.ID, element)))#等待10s,每500ms查询一次,直到元素加载完毕或超过10s结束
			usrName = self.__driver.find_element_by_id(element)
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.NAME, element)))
			usrName = self.__driver.find_element_by_name(element)
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.XPATH, element)))
			usrName = self.__driver.find_element_by_xpath(element)
		else:
			print("find element error!")
		usrName.send_keys(self.__username)
	#输入网页密码
	def inputpassword(self, find_element_method, element):
		if(find_element_method == "id"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.ID, element)))
			passWrd = self.__driver.find_element_by_id(element)
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.NAME, element)))
			passWrd = self.__driver.find_element_by_name(element)
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.XPATH, element)))
			passWrd = self.__driver.find_element_by_xpath(element)
		else:
			print("find element error!")
		passWrd.send_keys(self.__password)
	#点击登陆
	def clicksubmit(self, find_element_method, element):
		if(find_element_method == "id"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.ID, element)))
			self.__driver.find_element_by_id(element).click()
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.NAME, element)))
			self.__driver.find_element_by_name(element).click()
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.XPATH, element)))
			self.__driver.find_element_by_xpath(element).click()
		else:
			print( "find element error!")
	#test
	def test(self, find_element_method, element):
		ActionChains(self.__driver).move_to_element(self.__driver.find_element_by_xpath(element)).perform()
		self.__driver.find_element_by_xpath(element).click()

def main():
	#登录打卡的网站
	browser1 = webdriver.Firefox()
	shuai = LoginUrl(browser1, "http://xxxxxxxxxx/index.html", u"your name", u"your password")
	shuai.openwebsite()
	# 输入账号
	shuai.inputusername("id", "loginid")
	# 输入密码
	shuai.inputpassword("id", "userpassword")
	# 点击登录
	shuai.clicksubmit("xpath", "//button[@id='submit']") 
	# 等待完成
	time.sleep(3)
	# 点击考勤
	shuai.clicksubmit("xpath", "//div[@class='singBtn']/span") 
	# 等待完成
	time.sleep(3)
	# 更新打卡时间,之前出问题是应为Xphth写的问题,简化之后就好了
	shuai.test("xpath", "//a[@class='resign']")
	print("succeess...")
	
if __name__ == "__main__":
	main()

4.代码解释

  1. 从main函数开始,首先登录网站,使用你自己的网站、用户名和密码来替换代码中的部分,正常情况我们手动登录的时候,由于cookie的问题,不需要我们重复输入,但是这里是调用还是需要重新输入的。
    在这里插入图片描述

  2. 接下来是输入账号和输入密码,参数“id”和“loginid‘这个并不是通用的,需要先手动登录网站,使用F12开发人员工具,查看网站的源代码,找到对应的标签。只需要在你的登录框处右击-》检查,就可以看到对应的源代码,如果代码中可以看到”id“标签和对应的值,就可以通过id来查找,同理,如果具有”name“标签和对应的值,也可以使用name查找。如果两者都没有,还可以通过Xpath来查找,这种方法具体请看第五节说明,完全不需要懂,有专门的工具帮助实现。
    在这里插入图片描述

  3. 账户和密码填写框的实现逻辑应该比较类似,都提供了三种定位方法,id标签、name标签和粗暴的Xpath定位。

  4. 当程序通过三种方法中的某种方法定位到账号密码框时,就需要程序帮我们填写账号和密码,也就是usrName.send_keys(self.__username)passWrd.send_keys(self.__password)

  5. 填写好文本之后,那自然就是点击登录按钮了,这次使用个不同的方法,也就是简单粗暴的Xpath大法,第二个参数一大串其实就是通过专门的工具生成的,直接拷贝进来就能用
    在这里插入图片描述

  6. self.__driver.find_element_by_xpath(element).click()这句的意思就是使用对应的方法,找到对应的元素,完成点击click操作。

  7. 剩下的点击打卡等等操作就是具体的点击步骤了,不同网站的顺序和方式不太一样,但是对于只需要点击的,实现的逻辑是一样的

5.Xpath使用介绍

方法1

1.下载文件xpath-helper.crx,现在只能网上搜,在Store里面已经搜索不到了
2.在Google浏览器或者Edge浏览器里边找到这个“扩展程序”选项菜单即可。
3.然后就会进入到扩展插件的界面了,把下载好的离线插件xpath-helper.crx拖动到这个扩展界面便可以了,它会有提示,松开鼠标即可。
4.添加成功后,可以用快捷键Ctrl+shift+x来调出界面编写xpath, 再按一次就会关掉,打开xpath插件,按住shift,用鼠标所处的位置,就会自动生成对于的xpath元素,拷贝粘贴即可食用。

方法2

什么?懒得下载,那也没关系,浏览器提供了现成的工具,也很好用
右击-》检查-》定位到前端代码-》右击-》复制-》找到复制为xpath元素
效果是一样一样的。

更新

光有个打卡的功能,其实还不够完善,毕竟打卡这种事是讲究时效性的,时间太早也不行,时间晚了一分钟可就要扣钱了,而且周末也不用来公司打卡呀!
先增加时间模块头文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from time import strftime,asctime,ctime,gmtime,mktime
import datetime

然后就是获取当前时间,获取周末信息

	# 计算几天的年月日,然后换算成周几,其中周六是5,周日是6,周一是0
	today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
	print("当前时间:"+ strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
	print("今天是周"+str(today.weekday()+1))
	# 如果不是周六或者周末,那就启动打卡任务
	if(today.weekday()!=5 and today.weekday()!=6):
		do_something()
	else:
		# 更新weekday
		today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
		print("当前时间:"+ strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
		print("今天是周"+str(today.weekday()+1))
		time.sleep(60*60*24)

总结

对于复杂的xpath,直接复制粘贴可能导致程序定位元素失败,这时候可能需要简化xpath helper生成的东西,如何简化呢,例如
/html/body/div[@id='container']/div[@id='LoginContainer']/div[@class='e9login-content']/div[@class='e9login-element e9login-btn']/div[@class='e9login-form-submit e9login-submit']/button[@id='submit']
直接简写成
//button[@id='submit']

适用范围:可以解决不需要验证码的网站,对于不同的点击顺序,按照思路修改就好了,一直刷新不太好,可以结合Python的时间库,在特定的时间操作网站。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值