我們公司填寫日志都是在web上登錄OA進行填寫,但是由於公司OA系統年歲已高,使用的時候非常卡頓,一般一個月的日志填寫需要1個小時,有80%的時間都是在等待OA系統響應,實在是有點被煩到了,於是產生了開發一個日志自動填寫腳本的想法,功能很簡單,就是自己先在EXCEL中填好日志,然后按照格式自動讀取EXCEL文件並填入OA,就可以不需要人再去點點點了。
於是考慮使用python,selenium來編寫腳本文件,基本思路是通過爬蟲模仿人點擊行為,一步步完成OA的填寫過程。
selenium的使用需要:
1.安裝selenium的Python包。
在anaconda prompt中安裝selenium:
pip install selenium
2.下載對應瀏覽器的Selenium Webdriver並配置到系統變量(PATH)。
不同的瀏覽器需要不同的webdriver,我這里用的是火狐瀏覽器,對應的webdriver是geckodriver,在GITHUB上能夠找到WIN10系統的geckodriver下載地址,鏈接是 https://github.com/mozilla/geckodriver/releases。
下載后將下載下來的GeckoDriver.exe放入python安裝路徑下的Scripts文件夾內,或者放在其他路徑,然后將該路徑加入環境變量。
隨后可以在CMD中輸入geckodriver來測試是否安裝成功。如果成功了則會有如下提示:
現在開始着手編寫Python腳本代碼,先需要明確人工填寫日志的操作步驟,
日志的人工填寫過程大致如下:
1.登錄OA
2.選擇計划管理-工作日志填寫-右鍵點擊我的工作-選擇新建-並在彈出的窗口中填寫日志文件信息
3.保存日志文件,完成日志填寫。
這個過程中大概需要有如下幾類操作:
#啟動和配置webdriver
from selenium import webdriver #導入webdriver browser = webdriver.Firefox() #啟動瀏覽器配置,命名為browser,這個browser可以看做是瀏覽器的遙控器 browser.get("http://XXXXXX") #將地址傳給broswer
1.選定按鈕並單擊鼠標左鍵。
browser.find_element_by_id("navigatetitle6").click()
2.選定輸入框並輸入內容。
browser.find_element_by_class_name("Wdate").send_keys(date)
3.點擊下拉對話框並選擇對應項。
Select(browser.find_element_by_name("finished")).select_by_value(status)
4.選定元素並點擊鼠標右鍵,在彈出的對話框中選定按鈕並單擊鼠標左鍵。
ActionChains(browser).context_click(browser.find_element_by_xpath("//div[@id = 'tree']/ul/li/a")).perform() #實現在元素上右鍵點擊
browser.find_element_by_xpath("//div[@id = 'vakata-contextmenu']/ul/li[1]/a").click() #實現在彈出的對話框中點擊鼠標左鍵
其實總結起來,想用代碼表示每一個人工操作步驟,不外乎都是元素定位+操作執行,具體來說步驟如下:
1.找到元素(按鈕、對話框、下拉框等)的html源代碼
通過F12打開 開發者模式 查看HTML源碼,火狐瀏覽器可以用ctrl+shift+C選擇需要定位的元素。
元素通常包含id、name、class等屬性,可以通過這些屬性來對元素進行定位,但這些屬性可能存在重名,需要小心。
2.元素定位
webdriver 提供了一系列的對象定位方法,常用的有以下幾種:
id定位:find_element_by_id()
name定位:find_element_by_name()
class定位:find_element_by_class_name()
link定位:find_element_by_link_text()
partial link定位:find_element_by_partial_link_text()
tag定位:find_element_by_tag_name()
xpath定位:find_element_by_xpath()
css定位:find_element_by_css_selector()
其中,id定位、name定位、class定位、xpath定位是最常用的幾種,對於有id、name、class等且不重名的元素,用對應的定位方法會更加便捷,但是有時元素不包含以上內容,則需要通過xpath進行定位。
在元素源代碼單擊右鍵->復制->Xpath可以得到該元素的Xpath,其類型如下:
//*[@id="mce_fullscreen_ifr"] #對應有獨立id的元素的Xpath
/html/body/p[7] #對應無獨立id的元素的Xpath

比如我這里需要定位“工作日志填寫”,id為sd91,那么我就需要先找到他所在的iframe,然后通過 browser.switch_to.frame()切換后,才能通過find_element_by_id()找到該元素。
#如果存在多個iframe嵌套的情況,則需要多次使用switch_to.frame來逐層切換
browser.switch_to.frame("main_iframe")
browser.switch_to.frame("viewFrame")
#完成元素定位和操作后,有可能需要返回頂層的frame,使用如下語句可實現:
browser.switch_to.default_content()
3.執行操作
回到剛才的幾類操作的源代碼:
1.選定按鈕並單擊鼠標左鍵:通過click()實現。
browser.find_element_by_id("navigatetitle6").click()
2.選定輸入框並輸入內容:通過send_keys()實現。
browser.find_element_by_class_name("Wdate").send_keys(date)
3.點擊下拉對話框並選擇對應項:
遇到下拉框選擇時,Selenium專門提供了Select類來處理下拉框,通常有三種選擇方法。
select.select_by_index(1) #index 索引從 0 開始
select.select_by_value("0") #value是option標簽的一個屬性值,並不是顯示在下拉框中的值 select.select_by_visible_text(u"xxx") #visible_text是在option標簽文本的值,是顯示在下拉框的值
# 導入 Select 類
from selenium.webdriver.support.ui import Select
# 執行下拉操作並根據下拉框中的值來確定選項
Select(browser.find_element_by_name("finished")).select_by_value(status)
4.選定元素並點擊鼠標右鍵,在彈出的對話框中選定按鈕並單擊鼠標左鍵:
這里需要導入Selelium中的ActionChains類,該類常用於模擬鼠標的行為,比如單擊,雙擊,右鍵,拖拽等行為。這個類還很不熟練,后面再補學。
#導入ActionChains類
from selenium.webdriver import ActionChains
#實現在元素上右鍵點擊
ActionChains(browser).context_click(browser.find_element_by_xpath("//div[@id = 'tree']/ul/li/a")).perform()
#實現在彈出的對話框中點擊鼠標左鍵
browser.find_element_by_xpath("//div[@id = 'vakata-contextmenu']/ul/li[1]/a").click()