時(shí)間:2023-07-06 00:09:01 | 來源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-06 00:09:01 來源:網(wǎng)站運(yùn)營(yíng)
用python編寫控制網(wǎng)絡(luò)設(shè)備的自動(dòng)化腳本8:網(wǎng)頁:項(xiàng)目地址:pip install selenium
第二步,下載瀏覽器驅(qū)動(dòng),selenium要調(diào)用瀏覽器驅(qū)動(dòng)才能使用。我比較喜歡用火狐,火狐瀏覽器驅(qū)動(dòng)可以從GitHub下載(https://github.com/mozilla/geckodriver/releases),下載下來的壓縮包解壓后得到geckodriver.exe,隨便扔到一個(gè)%PATH%目錄中(C:/Program Files/Python38/Scripts)。import timeimport selenium.webdriver #seleniumv瀏覽器 = selenium.webdriver.Firefox()v瀏覽器.get("http://192.168.1.1")time.sleep(1)w密碼 = v瀏覽器.find_element_by_id("lgPwd")w密碼.send_keys("********")time.sleep(1)w確定 = v瀏覽器.find_element_by_id("loginSub")w確定.click()time.sleep(1)
運(yùn)行結(jié)果如圖:import selenium.webdriverdef f創(chuàng)建連接(a地址): v瀏覽器 = selenium.webdriver.Firefox() v瀏覽器.get(a地址) return v瀏覽器
f創(chuàng)建連接 的功能是創(chuàng)建一個(gè)瀏覽器對(duì)象,并打開具體地址。這段代碼只是一個(gè)簡(jiǎn)單例子,實(shí)際的 f創(chuàng)建連接 要處理不同瀏覽器的情況,代碼更復(fù)雜。from ..基礎(chǔ)接口 import 設(shè)備from selenium.common import exceptions #seleniumclass I設(shè)備(設(shè)備.I設(shè)備): def __init__(self, a連接): self.m連接 = a連接 def fs地址(self, a地址): self.m連接.get(a地址) def fg地址(self): return self.m連接.current_url def f查找(self, a找: str): try: v元素 = self.m連接.find_element_by_xpath(a找) return 元素.C元素(v元素) except exceptions.NoSuchElementException as e: return None
網(wǎng)絡(luò)設(shè)備腳本/網(wǎng)頁接口/元素.pyclass C元素: """對(duì)selenium網(wǎng)頁元素的封裝""" def __init__(self, a元素): self.m元素 = a元素 def f查找(self, a找): return C元素(self.m元素.find_element_by_xpath(a找)) def f點(diǎn)擊(self): self.m元素.click() def f清除(self): self.m元素.clear() def f輸入(self, a): self.m元素.send_keys(a) def fg文本(self): if self.m元素.tag_name in ("input",): #表單控件從值屬性取文本 return self.m元素.get_attribute("value") return self.m元素.text def fg屬性(self, a屬性名): return self.m元素.get_attribute(a屬性名)
import cflw代碼庫py.cflw網(wǎng)頁連接 as 網(wǎng)頁連接import 網(wǎng)絡(luò)設(shè)備腳本.普聯(lián) as 普聯(lián)v連接 = 網(wǎng)頁連接.f創(chuàng)建連接("http://192.168.1.1")v設(shè)備 = 普聯(lián).f創(chuàng)建設(shè)備(v連接, 普聯(lián).E型號(hào).wdr5620)
這里說一下如何判斷一個(gè)連接是否是網(wǎng)頁連接。一般python中判斷一個(gè)類型是否和另外一個(gè)類型相同或存在繼承關(guān)系可以用type(a) == A
或isinstance(a, A)
這樣的方法。selenium里面瀏覽器類都繼承自selenium.webdriver.remote.webdriver.WebDriver
,寫出來就變成isinstance(連接, selenium.webdriver.remote.webdriver.WebDriver)
,并且要在文件頂部寫一句import selenium
,代碼如下:import selenium.webdriver.remote.webdriverdef fi網(wǎng)頁連接(a連接): return isinstance(a連接, selenium.webdriver.remote.webdriver.WebDriver)#好像沒什么問題
這段判斷代碼看起來好像沒什么問題,如果傳進(jìn)去的是其他連接就返回False,看起來很合理。但是忽略了一種重要情況,用戶沒有安裝selenium的話,第一行會(huì)拋出ModuleNotFoundError異常。所以這時(shí)候就要尋找一種不導(dǎo)入模塊也能判斷網(wǎng)頁連接的辦法。a連接.__class__
會(huì)得到像 <class 'selenium.webdriver.firefox.webdriver.WebDriver'>
這樣的一個(gè)類,只要揪著這個(gè)類名做判斷就行。def fi網(wǎng)頁(a連接): if "selenium" in str(a連接.__class__): #selenium return True return False
至于判斷型號(hào)判斷版本沒什么好說的,用一堆if...elif...else就行了。f創(chuàng)建設(shè)備
長(zhǎng)得像這樣:from .基礎(chǔ)接口 import 連接層def f創(chuàng)建設(shè)備(a連接, a型號(hào), a版本 = 0): if 連接層.fi網(wǎng)頁(a連接): from .普聯(lián)網(wǎng)頁 import 設(shè)備 return 設(shè)備.C設(shè)備(a連接, a型號(hào), a版本) raise ValueError("不支持的連接")
其中的C設(shè)備
就是具體的設(shè)備類,其構(gòu)造函數(shù)接收連接、型號(hào)、版本,供模式層使用。from ..網(wǎng)頁接口 import 設(shè)備class C設(shè)備(設(shè)備.I設(shè)備): def __init__(self, a連接, a型號(hào), a版本): 設(shè)備.I設(shè)備.__init__(self, a連接) self.m型號(hào) = a型號(hào) self.m版本 = a版本
f創(chuàng)建設(shè)備
得到設(shè)備對(duì)象后,接著獲取一個(gè)用戶模式,用戶模式是網(wǎng)絡(luò)設(shè)備正常運(yùn)行情況下通往其他模式的入口,既然是入口,也就包含了登錄操作。在腳本中,這個(gè)過程就像這樣:import cflw代碼庫py.cflw網(wǎng)頁連接 as 網(wǎng)頁連接import 網(wǎng)絡(luò)設(shè)備腳本.普聯(lián) as 普聯(lián)v連接 = 網(wǎng)頁連接.f創(chuàng)建連接("http://192.168.0.1")v設(shè)備 = 普聯(lián).f創(chuàng)建設(shè)備(v連接, 普聯(lián).E型號(hào).wdr5620)v用戶模式 = v設(shè)備.f模式_用戶()v用戶模式.f登錄(a密碼 = "******")
f模式_用戶
的內(nèi)容很簡(jiǎn)單,直接創(chuàng)建一個(gè)用戶模式對(duì)象并返回。from ..網(wǎng)頁接口 import 設(shè)備class C設(shè)備(設(shè)備.I設(shè)備): def f模式_用戶(self): from . import 用戶模式 return 用戶模式.C用戶模式(self)
接著是用戶模式。在網(wǎng)頁中,一個(gè)網(wǎng)頁模式總是保存設(shè)備對(duì)象,以實(shí)現(xiàn)對(duì)網(wǎng)頁的操控。所以這個(gè)C用戶模式
有2個(gè)函數(shù),一個(gè)構(gòu)造函數(shù),一個(gè)登錄函數(shù)。import timefrom ..基礎(chǔ)接口 import 用戶模式class C用戶模式(用戶模式.I用戶模式): def __init__(self, a設(shè)備): self.m設(shè)備 = a設(shè)備 def f登錄(self, a密碼 = "", a用戶名 = None): w密碼框 = self.m設(shè)備.f查找("//input[@id='lgPwd']") w密碼框.f輸入(a密碼) w確定 = self.m設(shè)備.f查找("//input[@id='loginSub']") w確定.f點(diǎn)擊()
其中的f登錄
就是把“獲取網(wǎng)頁元素和操控網(wǎng)頁的過程”一節(jié)的代碼拿過來改一改,就變成了封裝過一遍的代碼。f手動(dòng)輸入驗(yàn)證碼
用來把焦點(diǎn)聚集在輸入框中,讓用戶手動(dòng)輸入驗(yàn)證碼,并且判斷驗(yàn)證碼是否輸入完畢。import cflw代碼庫py.cflw時(shí)間 as 時(shí)間from . import 元素def f手動(dòng)輸入驗(yàn)證碼(a元素, a長(zhǎng)度): a元素.f聚焦() v循環(huán)阻塞 = 時(shí)間.C循環(huán)阻塞(60, a間隔 = 1) while v循環(huán)阻塞.f滴答(): if len(a元素.fg文本()) >= a長(zhǎng)度: #有輸入 return True else: #沒有輸入 return False
在f登錄
中,先獲取網(wǎng)頁元素,自動(dòng)輸入用戶名密碼,接著手動(dòng)輸入驗(yàn)證碼,最后判斷是否登錄成功。import timefrom ..基礎(chǔ)接口 import 用戶模式from ..基礎(chǔ)接口 import 異常from ..網(wǎng)頁接口 import 圖片class C用戶模式(用戶模式.I用戶模式): def f登錄(self, a用戶名, a密碼): w用戶名 = self.m設(shè)備.f查找("//*[@id=/"user/"]") w用戶名.f輸入(a用戶名) w密碼 = self.m設(shè)備.f查找("//*[@id=/"password/"]") w密碼.f輸入(a密碼) w驗(yàn)證碼 = self.m設(shè)備.f查找("//*[@id=/"verify/"]") w登錄 = self.m設(shè)備.f查找("//*[@id=/"button/"]") v驗(yàn)證碼 = 圖片.f手動(dòng)輸入驗(yàn)證碼(w驗(yàn)證碼, 4) if v驗(yàn)證碼: w登錄.f點(diǎn)擊() time.sleep(1) # 結(jié)束 self.m設(shè)備.f查找_直到('//*[@id="ext-gen100"]') time.sleep(1)
class C模式wdr5620: c網(wǎng)絡(luò)狀態(tài) = ("netStateMbtn",) c設(shè)備管理 = ("routeMgtMbtn",) c設(shè)備管理_主人網(wǎng)絡(luò) = ("routeMgtMbtn", "linkedEpt_rsMenu") c設(shè)備管理_已禁設(shè)備 = ("routeMgtMbtn", "limitedEpt_rsMenu") c應(yīng)用管理 = ("appsMgtMbtn",) c路由設(shè)置 = ("routerSetMbtn",) c路由設(shè)置_tplinkid = ("routerSetMbtn", "cloudAnt_rsMenu") c路由設(shè)置_上網(wǎng)設(shè)置 = ("routerSetMbtn", "network_rsMenu") c路由設(shè)置_無線設(shè)置 = ("routerSetMbtn", "wireless2G_rsMenu") c路由設(shè)置_lan口設(shè)置 = ("routerSetMbtn", "lanSet_rsMenu") c路由設(shè)置_dhcp服務(wù)器設(shè)置 = ("routerSetMbtn", "dhcpServer_rsMenu") c路由設(shè)置_修改管理員密碼 = ("routerSetMbtn", "changeWebPwd_rsMenu") c路由設(shè)置_備份和載入配置 = ("routerSetMbtn", "bakRrestore_rsMenu") c路由設(shè)置_重啟和恢復(fù)出廠 = ("routerSetMbtn", "reBootSet_rsMenu") c路由設(shè)置_系統(tǒng)日志 = ("routerSetMbtn", "sysLog_rsMenu")
然后在設(shè)備類中實(shí)現(xiàn)切換過程class C設(shè)備: def __init__(self, a連接, a型號(hào), a版本): #省略其他代碼 self.ma模式 = [] def f切換模式(self, aa模式: tuple): if self.ma模式 == aa模式: return for v模式 in aa模式: v元素 = self.f查找(f"//*[@id='{v模式}']") v元素.f點(diǎn)擊() self.ma模式 == aa模式
其實(shí)這里還可以優(yōu)化一下,從最頂級(jí)開始逐級(jí)判斷是否不同模式,然后從那個(gè)不同的地方開始切換,這樣可以減少點(diǎn)擊次數(shù),加快切換模式的速度。我懶得優(yōu)化了,反正python很慢,網(wǎng)絡(luò)也很慢,所以慢就慢了。import selenium.webdriver #seleniumfrom ..網(wǎng)頁接口 import 設(shè)備 as 網(wǎng)頁設(shè)備from ..命令行接口 import 命令from ..命令行接口 import 設(shè)備 as 命令行設(shè)備from ..思科命令行.常量 import *from . import 命令行用戶模式 as 實(shí)現(xiàn)用戶模式class C設(shè)備(網(wǎng)頁設(shè)備.I設(shè)備, 命令行設(shè)備.I設(shè)備): """適用于: c7200""" def __init__(self, a連接, a型號(hào), a版本): 網(wǎng)頁設(shè)備.I設(shè)備.__init__(self, a連接) 命令行設(shè)備.I設(shè)備.__init__(self, a連接) self.m型號(hào) = a型號(hào) self.m版本 = a版本 self.ma模式棧 = [] #網(wǎng)頁 def fg命令框(self, a包裝 = True): w命令框 = self.f查找("/html/body/pre/form/dt/input[2]", a包裝) return w命令框 #適配 def f輸出(self): w輸出框 = self.f查找("/html/body/pre/form/dt/pre", False) return w輸出框.text def f輸入(self, a文本): w命令框 = self.fg命令框(False) w命令框.send_keys(str(a文本)) def f刷新(self): w命令框 = self.fg命令框(False) w命令框.clear() w命令框.send_keys(selenium.webdriver.common.keys.Keys.ENTER) #模式 def f模式_用戶(self): return 實(shí)現(xiàn)用戶模式.C用戶模式(self) #命令 def f退出(self): self.f執(zhí)行命令("exit") def f執(zhí)行命令(self, a命令): w命令框 = self.fg命令框(False) w命令框.send_keys(str(a命令)) w命令框.send_keys(selenium.webdriver.common.keys.Keys.ENTER) time.sleep(0.5) return self.f輸出()
這里有一部分模式類也要重寫,比如用戶模式,思科c7200的登錄過程在打開網(wǎng)頁的過程中彈出的登錄框中輸入用戶名密碼登錄。這個(gè)登錄框由瀏覽器控制,不屬于網(wǎng)頁元素。所以用戶模式的 f登錄 要省略掉。import timefrom ..思科命令行 import 用戶模式class C用戶模式(用戶模式.C用戶模式): def __init__(self, a): 用戶模式.C用戶模式.__init__(self, a) def f登錄(self): time.sleep(0.5) self.m設(shè)備.f輸入_結(jié)束符() def f模式_全局配置(self): from . import 命令行全局配置 return 命令行全局配置.C全局配置(self)
要重寫的還有全局配置模式,思科網(wǎng)頁中進(jìn)入全局配置模式的命令是“configure http”,和命令行不一樣,所以進(jìn)入模式命令也得改:from ..思科命令行 import 全局配置class C全局配置(全局配置.C全局配置): def __init__(self, a): 全局配置.C全局配置.__init__(self, a) def fg進(jìn)入命令(self): return "configure http"
ip http serverusername asdf privilege 15 password 123456interface fastethernet 0/0 ip address dhcpline vty 0 4 login local
檢查路由器獲取到的地址,然后確認(rèn)電腦是否能訪問路由器。import cflw代碼庫py.cflw網(wǎng)頁連接 as 網(wǎng)頁連接import 網(wǎng)絡(luò)設(shè)備腳本 as 腳本import 網(wǎng)絡(luò)設(shè)備腳本.思科 as 思科def main(): v連接 = 網(wǎng)頁連接.f創(chuàng)建連接("http://asdf:123456@192.168.44.129") v設(shè)備 = 思科.f創(chuàng)建設(shè)備(v連接, 思科.E型號(hào).c7200, 15.2) #用戶 v用戶模式 = v設(shè)備.f模式_用戶() v用戶模式.f登錄() #全局配置 v全局配置 = v用戶模式.f模式_全局配置() #接口配置l0 v接口配置 = v全局配置.f模式_接口("l0") v接口配置.fs網(wǎng)絡(luò)地址4("1.1.1.1/32") #接口配置f0/0 v接口配置 = v全局配置.f模式_接口("f0/1") v接口配置.fs網(wǎng)絡(luò)地址4("12.0.0.1/24") #用戶配置 v用戶配置 = v全局配置.f模式_用戶("asdf") v用戶配置.fs密碼("123456")if __name__ == "__main__": main()
運(yùn)行結(jié)果:關(guān)鍵詞:自動(dòng)化,腳本,設(shè)備,編寫,控制,網(wǎng)絡(luò)
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。