Python3+Selenium+Chrome實現自動填寫WPS表單
引言
本文通過python3、第三方python庫Selenium和谷歌瀏覽器Chrome,完成WPS表單的自動填寫。
開發環境配置
python3的安裝:略,網上都有教程。
Selenium的安裝:在命令列輸入pip3 install selenium
並回車即可完成安裝,如果不成功,查詢網上教程。
Chrome的安裝:略,網上都有教程。
因為Selenium需要ChromeDriver來驅動Chrome,所以還需要下載驅動ChromeDriver。下面重點介紹一下ChromeDriver的安裝(如不太清楚,查詢網上教程):
1.確定谷歌瀏覽器的版本號:首先開啟谷歌瀏覽器,點選右上角豎著的三個點—幫助—關於Google Chrome,可以看到谷歌瀏覽器的版本號。
2.下載ChromeDriver:從ChromeDriver映象站裡找到谷歌瀏覽器版本號對應的資料夾並開啟,從中找到對應的系統後下載。
3.配置:將壓縮包解壓後得到可執行檔案,將其配置到環境變數Path下,Windows可以直接放到Python的Scripts目錄下(因為該目錄一般都在環境變數裡)。
4.驗證:在命令列輸入chromeDriver並回車,如果不報錯,即完成安裝。 也可以採用火狐瀏覽器(也需要額外下載相應驅動)和PhantomJS瀏覽器引擎(不需要額外下載相應驅動,但是無視覺化介面)。
完成以上步驟即可進行程式碼編寫。
編寫程式碼
這個是測試用的WPS表單。
如上圖,我們先分析一下這個表單:
這個表單已經列舉出大部分WPS表單問題形式:
1.像問題1和3這種需要輸入文字或者數字的都屬於INPUT元件。我們用如下程式碼操作這種元件。其中?
要修改為N-1
,表示第N
個問題,比如問題1的話,input_?
應該改為input_0
;問題3的話,input_?
應該改為input_2
。'XXX'
應改改為自己的內容,即文字或者數字。
answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_?_!'))) answer.click()
2.像問題2、4和6(其中問題6後面再說)這種不需要輸入只需要一次選擇的都屬於LABEL元件(本來應該是單選和多選元件,但是WPS表單是用Label元件實現的)。我們用如下程式碼操作這種元件。其中?
要修改為N-1
,表示第N
個問題,用法同上;'!'
也要修改為N-1
,表示第N
個選項,比如問題2要選中第1個選項的話,select_label_wrap_?_!
應改為select_label_wrap_1_0
;要選中第2個選項的話,select_label_wrap_?_!
應改為select_label_wrap_1_1
。
answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_?_!'))) answer.click()
對於問題6,雖然其元件也屬於LABEL元件,但涉及到填寫時間,所以利用time
庫來獲取當前時間,與選項作比較後賦值給t
,從而選中第t+1
個選項。其中?
要修改為N-1
,表示第N
個問題,用法同上。
localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時間為:1100-1200") else: t = 2 print("填寫時間為:1800-2000") answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_?_' + str(t)))) answer.click()
3.像問題5這種需要多次點選選擇的都屬於PICKER元件。這種PICKER元件只能針對性的編寫程式碼,好在一般表單只有一個日期PICKER控制元件。我們用如下程式碼操作這種元件。這個不需要修改,但是如果有兩個日期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()
因此,圖示表單應該用以下程式碼進行自動填寫,執行後會彈出Chrome瀏覽器視窗,開啟對應WPS表單網頁,自動填入內容,等待10s秒(方便檢查或者反悔,反悔的話關閉網頁即可)後,自動確認完成填寫,最後命令列輸出Perfect!(只有命令列輸出Perfect!或者網頁顯示錶單填寫成功才表示自動填寫成功)。
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表單的網址 url = 'https://f.wps.cn/form-write/uwDUPB2N/' # 完成瀏覽器物件的初始化,設定超時時間為10秒。 browser = webdriver.Chrome() wait = WebDriverWait(browser,10) browser.get(url) ################################ # 針對INPUT元件,XXX替換成自己的內容。 answer = wait.until(EC.element_to_be_clickable((By.ID,'input_0'))) answer.send_keys('XXX') # 針對LABEL元件。 answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_1_0'))) answer.click() # 針對INPUT元件,XXX替換成自己的內容。 answer = wait.until(EC.element_to_be_clickable((By.ID,'input_2'))) answer.send_keys('18') # 針對LABEL元件。 answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_3_0'))) answer.click() # 針對PICKER元件。 answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.ant-calendar-today-btn'))) answer.click() # 針對詢問時間的INPUT元件。 localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時間為:1100-1200") else: t = 2 print("填寫時間為:1800-2000") answer = wait.until(EC.element_to_be_clickable((By.ID,'select_label_wrap_5_' + str(t)))) answer.click() ################################ # 等待10秒 time.sleep(10) # 點選提交 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!')
類似WPS表單,只需要修改網址url和32個#
之間的內容即可。
建議將time.sleep()
中的值調大一些,這樣還可以留出足夠的時間讓自己檢查一下,也可以把以下程式碼刪掉,這樣的話,只會自動填寫,不會自動確認。
# 點選提交 commit = wait.until(EC.element_to_be_clickable((By.ID,'bind_phone_modal_confirm_button'))) yes.click()
這裡再給一份針對某表單的程式碼,僅供參考學習交流,謹記若表單變動,程式碼也要變動:
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表單的網址' 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-today-btn'))) answer.click() localtime = time.localtime(time.time()) if localtime.tm_hour < 7: t = 0 print("填寫時間為:0700-0900") elif localtime.tm_hour < 11: t = 1 print("填寫時間為:1100-1200") else: t = 2 print("填寫時間為: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!')
總結
以上所述是小編給大家介紹的Python3+Selenium+Chrome自動填寫WPS表單,希望對大家有所幫助!
尾言
最後,祝福武漢早日康復,武漢加油!