Python3+Selenium+Chrome實(shí)現(xiàn)自動(dòng)填寫WPS表單
引言
本文通過python3、第三方python庫Selenium和谷歌瀏覽器Chrome,完成WPS表單的自動(dòng)填寫。
開發(fā)環(huán)境配置
python3的安裝:略,網(wǎng)上都有教程。
Selenium的安裝:在命令行輸入pip3 install selenium
并回車即可完成安裝,如果不成功,查找網(wǎng)上教程。
Chrome的安裝:略,網(wǎng)上都有教程。
因?yàn)镾elenium需要ChromeDriver來驅(qū)動(dòng)Chrome,所以還需要下載驅(qū)動(dòng)ChromeDriver。下面重點(diǎn)介紹一下ChromeDriver的安裝(如不太清楚,查找網(wǎng)上教程):
1.確定谷歌瀏覽器的版本號(hào):首先打開谷歌瀏覽器,點(diǎn)擊右上角豎著的三個(gè)點(diǎn)—幫助—關(guān)于Google Chrome,可以看到谷歌瀏覽器的版本號(hào)。
2.下載ChromeDriver:從ChromeDriver鏡像站里找到谷歌瀏覽器版本號(hào)對(duì)應(yīng)的文件夾并打開,從中找到對(duì)應(yīng)的系統(tǒng)后下載。
3.配置:將壓縮包解壓后得到可執(zhí)行文件,將其配置到環(huán)境變量Path下,Windows可以直接放到Python的Scripts目錄下(因?yàn)樵撃夸浺话愣荚诃h(huán)境變量里)。
4.驗(yàn)證:在命令行輸入chromeDriver并回車,如果不報(bào)錯(cuò),即完成安裝。 也可以采用火狐瀏覽器(也需要額外下載相應(yīng)驅(qū)動(dòng))和PhantomJS瀏覽器引擎(不需要額外下載相應(yīng)驅(qū)動(dòng),但是無可視化界面)。
完成以上步驟即可進(jìn)行代碼編寫。
編寫代碼
這個(gè)是測試用的WPS表單。
如上圖,我們先分析一下這個(gè)表單:
這個(gè)表單已經(jīng)列舉出大部分WPS表單問題形式:
1.像問題1和3這種需要輸入文字或者數(shù)字的都屬于INPUT組件。我們用如下代碼操作這種組件。其中?
要修改為N-1
,表示第N
個(gè)問題,比如問題1的話,input_?
應(yīng)該改為input_0
;問題3的話,input_?
應(yīng)該改為input_2
。'XXX'
應(yīng)改改為自己的內(nèi)容,即文字或者數(shù)字。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_!'))) answer.click()
2.像問題2、4和6(其中問題6后面再說)這種不需要輸入只需要一次選擇的都屬于LABEL組件(本來應(yīng)該是單選和多選組件,但是WPS表單是用Label組件實(shí)現(xiàn)的)。我們用如下代碼操作這種組件。其中?
要修改為N-1
,表示第N
個(gè)問題,用法同上;'!'
也要修改為N-1
,表示第N
個(gè)選項(xiàng),比如問題2要選中第1個(gè)選項(xiàng)的話,select_label_wrap_?_!
應(yīng)改為select_label_wrap_1_0
;要選中第2個(gè)選項(xiàng)的話,select_label_wrap_?_!
應(yīng)改為select_label_wrap_1_1
。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_!'))) answer.click()
對(duì)于問題6,雖然其組件也屬于LABEL組件,但涉及到填寫時(shí)間,所以利用time
庫來獲取當(dāng)前時(shí)間,與選項(xiàng)作比較后賦值給t
,從而選中第t+1
個(gè)選項(xiàng)。其中?
要修改為N-1
,表示第N
個(gè)問題,用法同上。
localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時(shí)間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時(shí)間為:1100-1200") else: t = 2 print("填寫時(shí)間為:1800-2000") answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_' + str(t)))) answer.click()
3.像問題5這種需要多次點(diǎn)擊選擇的都屬于PICKER組件。這種PICKER組件只能針對(duì)性的編寫代碼,好在一般表單只有一個(gè)日期PICKER控件。我們用如下代碼操作這種組件。這個(gè)不需要修改,但是如果有兩個(gè)日期PICKER控件,還要視情況修改,應(yīng)該沒有這么變態(tài)的表單。
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn'))) answer.click()
因此,圖示表單應(yīng)該用以下代碼進(jìn)行自動(dòng)填寫,運(yùn)行后會(huì)彈出Chrome瀏覽器窗口,打開對(duì)應(yīng)WPS表單網(wǎng)頁,自動(dòng)填入內(nèi)容,等待10s秒(方便檢查或者反悔,反悔的話關(guān)閉網(wǎng)頁即可)后,自動(dòng)確認(rèn)完成填寫,最后命令行輸出Perfect!(只有命令行輸出Perfect!或者網(wǎng)頁顯示表單填寫成功才表示自動(dòng)填寫成功)。
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 import time # WPS表單的網(wǎng)址 url = 'https://f.wps.cn/form-write/uwDUPB2N/' # 完成瀏覽器對(duì)象的初始化,設(shè)定超時(shí)時(shí)間為10秒。 browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) browser.get(url) ################################ # 針對(duì)INPUT組件,XXX替換成自己的內(nèi)容。 answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_0'))) answer.send_keys('XXX') # 針對(duì)LABEL組件。 answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_1_0'))) answer.click() # 針對(duì)INPUT組件,XXX替換成自己的內(nèi)容。 answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_2'))) answer.send_keys('18') # 針對(duì)LABEL組件。 answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_3_0'))) answer.click() # 針對(duì)PICKER組件。 answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn'))) answer.click() # 針對(duì)詢問時(shí)間的INPUT組件。 localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時(shí)間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時(shí)間為:1100-1200") else: t = 2 print("填寫時(shí)間為:1800-2000") answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_5_' + str(t)))) answer.click() ################################ # 等待10秒 time.sleep(10) # 點(diǎn)擊提交 commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button'))) commit.click() # 確認(rèn)提交 yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button'))) yes.click() # 反饋成功 print('Perfect!')
類似WPS表單,只需要修改網(wǎng)址url和32個(gè)#
之間的內(nèi)容即可。
建議將time.sleep()
中的值調(diào)大一些,這樣還可以留出足夠的時(shí)間讓自己檢查一下,也可以把以下代碼刪掉,這樣的話,只會(huì)自動(dòng)填寫,不會(huì)自動(dòng)確認(rèn)。
# 點(diǎn)擊提交 commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button'))) commit.click() # 確認(rèn)提交 yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button'))) yes.click()
這里再給一份針對(duì)某表單的代碼,僅供參考學(xué)習(xí)交流,謹(jǐn)記若表單變動(dòng),代碼也要變動(dòng):
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 import time url = '填入WPS表單的網(wǎng)址' browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) browser.get(url) answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_0'))) answer.send_keys('XXX') answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_1_1'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_2_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_3_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn'))) answer.click() localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時(shí)間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時(shí)間為:1100-1200") else: t = 2 print("填寫時(shí)間為:1800-2000") answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_5_' + str(t)))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_6'))) answer.send_keys('36.6') answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_7_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_8_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_9_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_10_1'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_11_0'))) answer.click() answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_12_0'))) answer.click() time.sleep(5) commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button'))) commit.click() yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button'))) yes.click() print('Perfect!')
總結(jié)
以上所述是小編給大家介紹的Python3+Selenium+Chrome自動(dòng)填寫WPS表單,希望對(duì)大家有所幫助!
尾言
最后,祝福武漢早日康復(fù),武漢加油!
相關(guān)文章
matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異)
這篇文章主要介紹了matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python matplotlib 畫圖窗口顯示到gui或者控制臺(tái)的實(shí)例
今天小編就為大家分享一篇Python matplotlib 畫圖窗口顯示到gui或者控制臺(tái)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05動(dòng)態(tài)設(shè)置django的model field的默認(rèn)值操作步驟
這篇文章主要介紹了動(dòng)態(tài)設(shè)置django的model field的默認(rèn)值操作步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python中的字符串類型基本知識(shí)學(xué)習(xí)教程
這篇文章主要介紹了Python中的字符串類型基本知識(shí)學(xué)習(xí)教程,包括轉(zhuǎn)義符和字符串拼接以及原始字符串等基礎(chǔ)知識(shí)講解,需要的朋友可以參考下2016-02-02jupyter notebook更換皮膚主題的實(shí)現(xiàn)
這篇文章主要介紹了jupyter notebook更換皮膚主題的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python語法學(xué)習(xí)之進(jìn)程間的通信方式
進(jìn)程在創(chuàng)建之后是沒有辦法獲取返回值的,但有的時(shí)候兩個(gè)進(jìn)程之間需要進(jìn)行相互之間的配合才能完成工作,這就需要通信的幫助。本文主要介紹了Python中進(jìn)程間的通信方式,需要的可以了解一下2022-04-04python使用pywinauto驅(qū)動(dòng)微信客戶端實(shí)現(xiàn)公眾號(hào)爬蟲
這個(gè)項(xiàng)目是通過pywinauto控制windows(win10)上的微信PC客戶端來實(shí)現(xiàn)公眾號(hào)文章的抓取。代碼分成server和client兩部分。server接收client抓取的微信公眾號(hào)文章,并且保存到數(shù)據(jù)庫。另外server支持簡單的搜索和導(dǎo)出功能。client通過pywinauto實(shí)現(xiàn)微信公眾號(hào)文章的抓取。2021-05-05python time.sleep()是睡眠線程還是進(jìn)程
這篇文章主要介紹了python time.sleep()是睡眠線程還是進(jìn)程,通過實(shí)例代碼給大家介紹了Python Sleep休眠函數(shù) ,需要的朋友可以參考下2019-07-07