基於Python-Selenium的日志自動填寫腳本開發


  我們公司填寫日志都是在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、name,但是找不到元素的情況出現,這個問題通常是由於iframe導致的,必須要先切換到該元素對應的iframe下,再定位元素。
    

 

   比如我這里需要定位“工作日志填寫”,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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM