記一次用python selenium 通過chrome+chromedriver 實現公司內網上網自動登入認證、上班自動登入打卡python指令碼筆記
背景
寫這個指令碼純屬是覺得好玩而已,一開始以為很簡單,看了大部分網上的程式碼確實很簡單就那麼幾行,自己也就想試試,後來發現由於這個還涉及了一些html的知識點發現還是沒那麼簡單的,從一開始獲取登入按鈕的input id到後面打卡按鈕無法使用發現還使用了iframe 巢狀的東東,幾天下來都是淚;然後網上也很少發現這種比較完整的一條龍教程;所以乾脆把這次的過程在這裡寫成筆記形式記錄下,也可以供網友參考參考,文中如有錯誤請多多指教。
一、環境準備
這裡只簡單的列下開發時的環境版本:注意版本對應關係一定要對要不然會讓你走很多彎路
- python 3.6.2
- selenium 3.13.0
- 這個可以直接接著pip如果python沒有裝請先安裝pip安裝參考:selenium安裝步驟
- chrome v59
- chromedriver v2.3
二、開發指令碼
其實這裡程式碼內容很簡單,網上程式碼隨便抓都是,只是要搬過來自己用就未必能用,還是會涉及其他東西需要注意的,廢話不多說直接貼原始碼:
#實現公司上網認證及自動打卡
from time import sleep
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#上網自動認證函式
def conn():
#driver = webdriver.Firefox()
driver = webdriver.Chrome()
#driver = webdriver.Ie()
driver.maximize_window()
#設定隱式時間等待
driver.implicitly_wait(8)
driver.get('http://192.168.1.1/webAuth/')
# une 可以通過瀏覽器F12 然後點選那個滑鼠箭頭按鈕 接著滑鼠指到哪裡就能定位到哪個元素得到對應的input id、name如果沒有則可以用xpath解決
#獲取對應元素的xpath 可以通過瀏覽器F12模式定位到對應元素原始碼然後右鍵拷貝xpath即可,當然可以通過googel瀏覽器的xpath helper 更簡單
#說明1111111111
driver.find_element_by_name("une").clear()
driver.find_element_by_name("une").send_keys('test')
elem_pwd = driver.find_element_by_name("passwd")
elem_pwd.clear()
elem_pwd.send_keys('test')
# 這裡我一開始就是因為瀏覽器版本和chromedrive不對(瀏覽器版本太高導致下面Keys.ENTER一直無法生效)
elem_pwd.send_keys(Keys.ENTER)
#elem_pwd.send_keys(Keys.RETURN) //與上面一個一樣
# 如果元素沒有id和name name用xpath 獲取 當然我們這裡登入藉助密碼輸入之後按類似回車的 效果 省去點選登入按鈕
#driver.find_element_by_xpath("/html/body/form/div/div/ul/li[2]/table/tbody/tr[3]/td/div/input[1]").click()
sleep(2)
#driver.close()
#直接關閉瀏覽器
driver.quit()
#上班打卡函式
def login():
#driver = webdriver.Firefox()
driver = webdriver.Chrome()
#driver = webdriver.Ie()
driver.maximize_window()
driver.implicitly_wait(8) # 設定隱式時間等待
# us ps 分別是賬號密碼框對應的xpath 這裡時xpath的絕對路徑雖然網友說不推薦,沒辦法對xpath不熟就怎麼簡單怎麼來吧
# 再次提醒下 這個網頁元素對應的xpath可以藉助火狐、chrome的F12模式定位到對應按鈕、方框的原始碼後,直接右鍵複製=》xpath即可得到絕對路徑xpath
# 如果嫌麻煩可以直接在chrome 下載個xpath helper 然後ctrl+shift+x 開啟、shitf+x 然後移動滑鼠到對應位置即可顯示xpath
us ="/html/body/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[3]/input"
ps ="//*[@id=\"logonpassfield\"]"
# 輸入要開啟的頁面
driver.get('http://test.login.cn/irj/servlet/prt/portal/prtroot/com.sap.portal.navigation.portallauncher.default')
driver.find_element_by_xpath(us).clear()
driver.find_element_by_xpath(us).send_keys("test")
driver.find_element_by_xpath(ps).clear()
driver.find_element_by_xpath(ps).send_keys('test')
#如果用下面這兩個就不用去找 對應的登入按鈕了 相當於直接輸完密碼按回車
#elem_pwd.send_keys(Keys.ENTER)
#elem_pwd.send_keys(Keys.RETURN)
# 通過xpath絕對路徑查詢登入按鈕 後直接click 點選
driver.find_element_by_xpath("/html/body/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[6]/table/tbody/tr/td[1]/a/img").click()
#這裡一定要記得 由於網頁中嵌套了多層iframe 得從最頂層一級級進入直到最後需要按鈕所在那層我這邊是在第3個iframe裡面所以要一層層進入下面3個
#這個到底是在那一層也是可以接著比如火狐瀏覽器F12模式,定位到對應元素原始碼時最底下的一欄可看出來 有如下字樣:iframe#iLeftIframe 其中#後面即為frame id
#說明2222222222
driver.switch_to_frame('ivuFrm_page0ivu0')
driver.switch_to_frame('EISBottom')
driver.switch_to_frame('iLeftIframe')
# 下面是另外一種查詢中進入方式 類似 like 包含檔案
#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'http://bem.cscs.cn:81/mis/EISTop.aspx')]"))
#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'/mis/EISIndex.aspx')]"))
#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'../hrs/work/UserWork.aspx')]"))
#找到需要按的按鈕單擊它 我這裡會跳到新的頁面去,下面分別時上班按鈕和下班按鈕,
#上班按鈕按下去之後就歐克了所以可以單擊完後即可關閉瀏覽器
driver.find_element_by_id("ibOn").click()
#如果是上班這裡可以關閉瀏覽器瞭如果是下班就按下面的邏輯來要到新網頁單擊某個按鈕,我這裡測試指令碼就搞個簡單的上班按鈕即可
#--------------------------下面註釋的是下班卡還不是很完整沒包括填寫工時,方法都是一樣的這裡就描述了,我是測試過可以用的
#下班按鈕要到新的頁面點選儲存才行, 下面這3個效果一樣
#driver.find_element_by_id("ibOff").click()
#driver.find_element_by_xpath("//*[@id=\"ibOff\"]").click()
#driver.find_element_by_xpath("//*[@id=\"ibOff\"]").send_keys(Keys.ENTER)
#彈出視窗處理這裡也是沒軟用可以不處理
#a=driver.switch_to_alert()
#print(a.text)
#a.accept() # 等同於點選“確認”或“OK”
#a.dismiss() # 等同於點選“取消”或“Cancel”
#回到第一級 這裡目前沒軟用
#driver.switch_to.default_content()
#由於上面單擊之後切到新的頁面了所以這裡需要切換頁面 得到selenium開啟的瀏覽器的所有控制代碼 切換導最後一個控制代碼 下班按鈕才需要哦
#all_handle = driver.window_handles
#driver.switch_to_window(all_handle[-1])
# 到新的頁面點選某個按鈕如果這裡不切過來會導致find_element_by_xpath 失敗找不到元素
#driver.find_element_by_xpath("//*[@id=\"btnsave\"]").click()
sleep(2)
#關閉瀏覽器
driver.quit()
#driver.Dispose()
if __name__=='__main__':
#呼叫函式登入打卡
print("上班開啟......")
login()
while True:
#這裡加入30分鐘判斷一次系統網路是否正常,如果異常則進行上網認證
exit_code = os.system('ping www.baidu.com')
if exit_code:
print("網路異常準備重新認證")
conn()
else:
print("網路正常無需認證")
#休眠30分鐘
sleep(60*30)
- 程式碼說明(注意還是針對如何獲取對應的元素id及xpath這個解決了就好辦多了)
- 元素定位find_element_by_id 函式是需要指定對應元素的id的這個可以通過F12獲取如果發現原始碼中沒有類似input id 那麼也可以用下面一種方法
- 元素定位find_element_by_xpath 函式可以用絕對路徑的xpath也可以用簡寫的,我這裡只是為了寫著玩就怎麼簡單怎麼來直接用絕對路徑這樣省事,當然除了這兩種方法獲取元素還有其他方法具體的大家自己去找,參考文章中也有說到。
- 有些網頁涉及巢狀多層網頁的比如本文中的打卡按鈕發現是巢狀在第3層(有關鍵字iframe算一層)這時候一定要記得一層層進入,要不然會導致find_element_by_xpath、find_element_by_id無法定位到元素切記,具體怎麼看在第幾層看下面第3個圖片說明(灰常重要)
其中第一處說明見圖
下圖就是獲取輸入使用者名稱的元素iddriver.find_element_by_name("une")
:
由於登入按鈕沒有id和name這裡用xpath,下圖就是獲取登入按鈕的xpathdriver.find_element_by_xpath("/html/body/form/div/div/ul/li[2]/table/tbody/tr[3]/td/div/input[1]")
:
其中第二處說明通過瀏覽器的F12功能分析檢視圖示元素對應在網頁中第幾層iframe巢狀中見圖
通過下圖得到了最終按鈕所在的層次後需要通過程式碼一層層進入driver.switch_to_frame('ivuFrm_page0ivu0')
:
driver.switch_to_frame('EISBottom')
driver.switch_to_frame('iLeftIframe')
三、執行
到這裡開發工作就完成了,執行很簡單比如上面的腳步是儲存在一個tt.py的檔案中,那麼只要在cmd(window的命令提示符)中輸入python tt.py
即可執行;文中的腳步只是作為一個測試腳步具體應用比如定時執行還是開機執行,每小時執行,這些都可以通過改造上面的main函式內容,也可以直接寫個window的批處理進行執行,網上好像還有將pytho腳步封裝成exe的這個大家就自己琢磨去了
參考文章
相關推薦
記一次用python selenium 通過chrome+chromedriver 實現公司內網上網自動登入認證、上班自動登入打卡python指令碼筆記
背景 寫這個指令碼純屬是覺得好玩而已,一開始以為很簡單,看了大部分網上的程式碼確實很簡單就那麼幾行,自己也就想試試,後來發現由於這個還涉及了一些html的知識點發現還是沒那麼簡單的,從一開始獲取登入按鈕的input id到後面打卡按鈕無法使用發現還使用了ifr
記一次用PXE+kickstart批量為20臺新服務器安裝centos7
根據 命令行界面 exe user size linux c mman win8 windows 基於PXE+kickstart批量安裝centos7: 本文是純文字,後續會補充圖片 1.環境: CentOS Linux release 7.4.1708 (Core)ker
記一次用Java Stream Api的經歷
最近有個專案需要用到推薦系統,弄了個簡單的相似度推薦演算法。 資料為: 化簡為: public class Worker { /** * 使用者編號 */ private long userId; /** * 期
記一次WebView使用異常,點選搜尋引擎頁內的超連結,無法跳轉到相應的頁面
事情是這樣的,有業務需求需要使用yandex(www.yandex.ru)這個搜尋引擎搜尋內容,在自己的activity裡面建立了一個webview,webview load這個搜尋引擎搜尋關鍵字(隨便一個關鍵字都可以),大概介面如下:隨便點選其中的連結項,正常情況下希望能l
用gdb調試python多線程代碼-記一次死鎖的發現
ubunt reg out 什麽 err local class tdi str | 版權:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。如有問題,可以郵件:[email protected] 前言
記一次與用戶的親密接觸
分類 多用戶 興趣 代碼 相關數 解答 後端 現在 拉取 眾所周知,埋點在互聯網時代可謂重要至極,是了解用戶行為的基礎。優雲Web自從上線以來陸續引來很多用戶嘗鮮,很多用戶對於優雲Web的埋點功能都是充滿濃厚的興趣,以下問答是小編在GOPS大會上與用戶的對話實錄。 Q1:看
記一次調試python內存泄露的問題
enable ini package 包括 bsp 應該 占用內存 ans blank 轉載:http://www.jianshu.com/p/2d06a1a01cc3 這兩天由於公司需要, 自己編寫了一個用於接收dicom文件(醫學圖像文件)的server. 經過各
記一次CentOS7進單用戶模式修改密碼的失敗經歷(faild to load SELinux policy freezing)
錯誤 load 解決方法 com IT ash 開啟 bre 學習 背景:Cent SO7.4root用戶密碼忘記,根據https://www.linuxidc.com/Linux/2016-08/134034.htm提供的放法修改完密碼之後系統啟動後一直停留在轉圈的界面(
記一次清理緩存的小事情(chrome) chrome下清理緩存不生效的問題
選擇 遇到 image 細節 後來 前端開發 bubuko 開發 技術 記一次清理緩存的小事情(chrome) chrome下清理緩存不生效的問題 前端開發中會經常涉及清理緩存的事情. 在一次開發後, 需要清理緩存,一個哥們怎麽清理都不生效, 於是向我求救. 在我看了下後,
記一次Python爬蟲開發經歷
light 情況 獲取 數據類型 true charm req 是我 遇到 為啥要做Python爬蟲,是因為我去找電影的某個網站有點坑,它支持tag標簽查詢自己喜歡的電影,但是不支持雙標簽或者三標簽查詢。由於一個電影對應多種類型(tag),這就意味著,我需要進入這個電影介紹
記一次MD5妙用
更改 利用 嵌入式 當前 項目組 行記錄 存儲 方案 介紹 記一次MD5妙用 最近項目組中在做歷史記錄的改造工作,主持討論了多次,但每次討論完都覺的很完美了,但實際在寫這部分邏輯的時候還是會發現一些問題出來,很難受,反反復復的暴露智商是硬傷,人艱不拆,暫先不扯這些真相了。介
記一次使用crontab計劃任務執行python指令碼所遇問題及處理的過程
今天把一個python指令碼遷移到Centos7,用crontab執行,期間遇到很多錯誤,最終把所遇問題一一處理,感覺有必要把處理過程記錄下來 1、問題環境 Centos7 x64 python2.7 和python 3.5 有安裝virtualenvwrappe
python爬蟲——記一次前所未有的經歷(爬取魔方格作文)
前言 我還是第一次遇到魔方格這麼處理請求的網站,這裡記錄一下 過程 1、爬取物件:http://zuowen.mofangge.com/html/zwDetail/20161023/u111424965.html 需要抓取中間作文格里的作文
記一次linux下用git安裝fastadmin的過程
1.安裝寶塔面板,阿里雲配置對應的安全組.在軟體管理介面下載mysql,php,apache,pm2管理器,phpmyadmin.(php版本最好只安裝一個,不然你需要確定你安裝的擴充套件是否安裝在你所選擇的php版本,php -v可以檢視當前預設的php版本) 2.進入網站目錄,clone
記一次通過v$active_session_history來分析問題的案例
關於:v$active_session_history是oracle中一個最重要的檢視之一,該檢視每秒一次記錄當前資料庫中的活動程序相關的資訊,可以用於問題的分析和診斷;同時awr還會將部分v$active_session_history中的部分記錄保留到dba_hist_a
記一次 python多執行緒+Queue的坑逼之旅
背景~ 在爬蟲中,需要用到代理ip,本人寫了一個模組來獲取和過濾代理ip(用多執行緒過濾,),,,在主執行緒中判斷可用的代理ip少於一定值了,獲取新的可用ip,問題來了。。多次呼叫代理ip模組之後報錯: can't start new thread !!!!!!
記一次亂用git reset --hard的慘痛經歷
起因: 今天在用git 的時候腦抽想回到某個版本,於是隨便上網搜了下命令,也沒仔細看,就用了git reset --hard xxx(commit id),結果版本是回了,但是工程裡的所有新加的檔案全部都自動刪除了,自動刪除了……這可真的急壞了,好幾天的心血都在這裡呢!!!!
記一次通過Memory Analyzer分析記憶體洩漏的解決過程
狀況描述: 最近專案新打的版本,過不了多長時間,專案就會掛掉。狀況就是處於一種假死的狀態。索引查詢都很慢,幾乎進行不了任何操作,慢慢卡死。 然後我們再發版時,只能基於之前打好的war包,替換或者增加c
讓天下沒有難用的資料庫 » 記一次not in 和 minus的優化
優化前: select count(t.id) from test t where t.status = 1 and t.id not in (select distinct a.app_id from test2 a
記第一次用Go寫程式解決Python效能問題
Go 學習有一段時間了,書還差一點沒看完,一直沒動手寫程式碼。 場景: 近期客戶抱怨我們給的資料匯出工具太慢了,領導說看看能不能優化。 思考: 第一時間想到了用Go,因為學了一段時間,也想實戰一下。 Go的速度是接近C/C++的,併發容易,且這個工具執行的任務都是一個個資料檔案解析,