大纲:
- 通过webdriver获取门户登录页面并点击发送验证码
- 通过webdriver获取门户关联的126邮箱,打开验证码邮件,获取邮件内容,通过正则提取验证码(注意在登录邮箱和打开邮件时有切换至iframe的操作)
- 通过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