登录需要邮箱验证码的门户系统脚本

大纲:

  1. 通过webdriver获取门户登录页面并点击发送验证码
  2. 通过webdriver获取门户关联的126邮箱,打开验证码邮件,获取邮件内容,通过正则提取验证码(注意在登录邮箱和打开邮件时有切换至iframe的操作)
  3. 通过webdriver将提取到的验证码发送至门户页面的验证码输入框并点击登录,最终实现门户系统的自动化登录

疑问:都说driver.implicitly_wait()这个方法更高效,但不知道为是什么用这种方法的时候元素经常会获取不到,所以本文中全部粗暴地用的time.sleep()方法。希望有知道原因的小伙伴告知一下。

iframe-1
在这里插入图片描述

iframe-2

在这里插入图片描述

门户登录代码

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from GetMenhuLoginNum import Login_126

class MenHuLogin(object):
	def __init__(self):
		self.driver = webdriver.Firefox()

	def MyApplicationLogin(self,url,name,pwd,mailurl,mailname,mailpwd):
		print("开始1")
		self.driver.get(url)
		print("开始2")
		time.sleep(1)
		#定位账号输入框
		el = self.driver.find_element_by_xpath("""//*[@placeholder="请输入账号"]""")
		print("开始3")
		#向账号输入框发送账号
		el.send_keys(name)
		#定位密码输入框
		el01 = self.driver.find_element_by_xpath("""//*[@placeholder="请输入密码"]""")
		print("开始3")
		time.sleep(1)
		#向密码输入框发送密码
		el01.send_keys(pwd)
		#定位获取验证码按钮
		sendMSG = self.driver.find_element_by_xpath("""//span[contains(text(),"获取验证码")]""")
		#点击“获取验证码”按钮
		sendMSG.click()
		#获取邮箱中的验证码
		time.sleep(1)
		window = self.driver.window_handles
		print(window)
		
		while True:
			try:				
				mat = Login_126()
				num = mat.MailLogin(mailurl,mailname,mailpwd)
				print(num)
				print("---------------------")
				if num.isdigit() == True:#通过判断验证码是否为数字类型来判断验证码是否获取成功
					break
			except Exception as ret:
				print(ret)
		print(num)
		#定位到验证码输入框
		
		ipt = self.driver.find_element_by_xpath("""//input[@placeholder="请输入验证码"]""")		
		time.sleep(1)
		#相输入框输入上面从邮箱获取的验证码
		ipt.send_keys(num)
		#定位登录按钮
		sub = self.driver.find_element_by_xpath("""//button[@type="submit"]""")	
		time.sleep(1)
		#点击登录按钮
		sub.click()
		newurl = self.driver.current_url
		return newurl
	
if __name__ == "__main__":
	url = 'http://xxxx/login'
	namelist= ["你的门户登录账号"]
	pwdlist = ["你的门户登录密码"]
	mailurl = 'https://mail.126.com/'
	mailname_list = ["xxxx你的126邮箱账号"]
	mailpwd_list = ["xxxx你的126邮箱密码"]	
	po = 0
	while po<len(namelist):
		name = namelist[po]
		pwd = pwdlist[po]		
		mailname = mailname_list[po]
		mailpwd = mailpwd_list[po]
		mapp = MenHuLogin()
		mapp.MyApplicationLogin(url,name,pwd,mailurl,mailname,mailpwd)
		time.sleep(2)
		po+=1

获取邮箱中的验证码GetMenhuLoginNum.py

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import re
#import xlrd

class Login_126(object):
	def __init__(self):
		#设置浏览器无头访问模式
		self.options = webdriver.FirefoxOptions()
		self.options.add_argument('-headless')
		self.driver = webdriver.Firefox(firefox_options=self.options)
		#self.driver = webdriver.Firefox()

	def MailLogin(self,url,name,pwd):
		print("开始1")
		#url = 'https://mail.126.com/'
		self.driver.get(url)
		print("开始2")
		ifr = self.driver.find_element_by_xpath("//iframe[@frameborder=0]")
		time.sleep(1)
		self.driver.switch_to_frame(ifr)
		print("定位到iframe")
		time.sleep(1)
		el = self.driver.find_element_by_xpath("""//*[@data-placeholder="邮箱帐号或手机号码"]""")
		print("开始3")
		time.sleep(1)
		el.send_keys(name)
		el01 = self.driver.find_element_by_css_selector("[data-placeholder=输入密码]")
		print("开始3")
		el01.send_keys(pwd)
		btn = self.driver.find_element_by_css_selector("#dologin")
		btn.click()
		time.sleep(1)
		newurl = self.driver.current_url
		num = self.GetRandomNums()
		return num
		
	def GetRandomNums(self):
		time.sleep(1)
		self.driver.refresh()
		time.sleep(1)
		#定位到收件箱
		receive_list = self.driver.find_element_by_xpath("""//span[contains(text(),"收件箱")]""")
		time.sleep(1)
		receive_list.click()
		time.sleep(1)
		#定位到邮件列表中要获取的邮件
		mail = self.driver.find_element_by_xpath("""(//span[contains(text(),"span元素的文本内容")])[1]""")
		mail.click()
		time.sleep(1)
		#获取邮件所在的iframe
		iframe = self.driver.find_element_by_xpath("""//iframe[@frameborder=0][@class="oD0"]""")
		time.sleep(1)
		#跳转到iframe
		self.driver .switch_to_frame(iframe)
		time.sleep(2)
		#获取邮件内容元素
		content = self.driver.find_element_by_css_selector(""".netease_mail_readhtml#content""")
		#获取邮件内容元素的文本内容
		mail_content = content.text
		#print(mail_content)
		#提取邮件文本中的验证码信息
		num = self.re_trim(mail_content)
		return(num)
		
	#正则匹配邮件内容中的验证码	
	def re_trim(self,s): 
		num = re.findall(r"\d+",s)[0]
		return(num)
	
if __name__ == "__main__":
	url = 'https://mail.126.com/'
	namelist= ["你的126邮箱账号"]
	pwdlist = ["你的126邮箱密码"]
	po = 0
	while po<len(namelist):
		name = namelist[po]
		pwd = pwdlist[po]
		mapp = Login_126()
		num = mapp.MailLogin(url,name,pwd)
		print(num)
		time.sleep(2)
		po+=1

猜你喜欢

转载自blog.csdn.net/KathyLJQ/article/details/110235638