Python學習筆記13:selenium webdriver 實現驗證碼登入
阿新 • • 發佈:2019-01-06
#通過ActionChains+autoit進行驗證碼圖片的下載,通過pytesseract識別驗證碼中的字元,由於有一定錯誤率,進行重試直至成功
from selenium import webdriver from LanternAnswer.login import Login # download.default_directory:設定下載路徑 # profile.default_content_settings.popups:設定為 0 禁止彈出視窗 # chrome 60以上版本無效,暫未找到方法。 # options = webdriver.ChromeOptions() # prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'} # options.add_experimental_option('prefs', prefs) # driver=webdriver.Chrome(executable_path='D:\\Python\\chromedriver.exe',chrome_options=options) driver = webdriver.Chrome(executable_path='D:\\Python\\chromedriver.exe') print(type(driver)) driver.implicitly_wait(10) driver.maximize_window() # 直接訪問登入介面 driver.get("https://sso.dtdjzx.gov.cn/sso/login") # 通過首頁進入登入介面 # driver.get("http://www.dtdjzx.gov.cn") # driver.find_element_by_xpath("/html/body/div[4]/a/img").click() # windows=driver.window_handles # driver.switch_to.window(windows[-1]) # time.sleep(10) # popup=driver.find_element_by_id("l_mods") # popup.find_element_by_id("mkjh").click() # target = driver.find_element_by_xpath("/html/body/div[5]/div[2]/div/div[3]") # driver.execute_script("arguments[0].scrollIntoView();", target) # # time.sleep(10) # # pyautogui.click(200,200) # time.sleep(10) # target.find_element_by_id("lbuts").click() # # driver.find_element_by_xpath('//*[@id="myxiaoxi"]') # Select(driver.find_element_by_id("shenfen")).select_by_visible_text("黨員") # driver.find_element_by_xpath('//*[@id="bts"]').click(); login = Login(); login.getvalidateCode(driver); login.login(driver, "hisense", "hisense") while (driver.find_element_by_id("validateCodeMessage").text == "驗證碼錯誤" or driver.find_element_by_xpath('//*[@id="parsley-id-9"]/span').text =="請輸入圖片驗證碼"): login.getvalidateCode(driver); login.login(driver, "hisense", "hisense")
login.py
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys import pytesseract from PIL import Image import win32api import time class Login(): def __init__(self): self.validateCode="0000"; def login(self, driver,usrname,password): driver.find_element_by_id("username").clear(); driver.find_element_by_id("username").send_keys(usrname); driver.find_element_by_id("password").clear(); driver.find_element_by_id("password").send_keys(password); driver.find_element_by_id("validateCode").clear(); driver.find_element_by_id("validateCode").send_keys(self.validateCode.strip()); driver.find_element_by_xpath('//*[@id="loginForm"]/div[4]/a[1]').click(); def getvalidateCode(self,driver): # codeimgsrc=driver.find_element_by_id("yanzhengma").get_attribute("src"); # codeimgurl="https://sso.dtdjzx.gov.cn/sso/login/"+codeimgsrc # 使用action進行右鍵操作彈出選單,使用autoit進行windows儲存操作 codeimg=driver.find_element_by_id("yanzhengma"); action=ActionChains(driver); action.move_to_element(codeimg) action.context_click(codeimg); # action.send_keys(Keys.DOWN); # action.send_keys("v") action.perform() win32api.ShellExecute(0,'open','D:\Python\saveimg.exe','','',1) time.sleep(10) image = Image.open("D:\\CodeImage.jpg") image=image.convert('L') #1.FileNotFoundError: [WinError 2] 系統找不到指定的檔案 # 方法1[推薦]: 將tesseract.exe新增到環境變數PATH中方法 #2: 修改pytesseract.py檔案,指定tesseract.exe安裝路徑 # 2.pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \\Tesseract-OCR\\tessdata/eng.traineddata') # 方法:在.py檔案配置中指定tessdata-dir pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' tessdata_dir_config = '--tessdata-dir "C:\\Program Files\\Tesseract-OCR\\tessdata"' self.validateCode = pytesseract.image_to_string(image,config=tessdata_dir_config) # self.validateCode=validateCode.strip()