3年前,在某大公司网路组工作过半年多时间,有时候客户有需求去定期获取Cisco网络设备(路由器,交换机,防火墙)公开的Bug信息。
前期工作的同事都是手动在网站搜索下载,重复性的工作,对写代码的人来说干着别扭。。。
当时正在看Selenium的内容,所有试着用Selenium来实现。
1,其实用其他的HTTP库urllib之类效率应该更高,但是为了以后的比对,我们每次搜索出来的结果界面都有自动截图,作为证据。
2,代码编写边调试。后面懒,未做格式美化和逻辑优化了。
3,需要实现准备配置文件,提供Cisco Bug的一些信息。
'''
author: tany_xie@qq.com
'''
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException,ElementNotVisibleException
import time
import xlrd
import os
from shutil import copy
ERRFLG=0
def check_load_finish():
pathstring1 =r"//div[@class = 'searchInfoToolBar']/div/div[@class = 'firstDiv']"
re_text1 = browser.find_element_by_xpath(pathstring1).text
print(re_text1)
loadmsg=r'//li[@class ="loadMessage"]'
try:
loadtext = browser.find_element_by_xpath(loadmsg).text
except NoSuchElementException:
if re_text1 != "":
return True
else:
return False
print(loadtext)
if re_text1 != "" or loadtext.find('No Matching Bugs Found') != -1:
return True
else:
return False
def check_results_of_bug(browser,bugpath):
pathstring =r"//div[@class = 'searchInfoToolBar']/div/div[@class = 'firstDiv']"
re_text = browser.find_element_by_xpath(pathstring).text
print("re_text:"+re_text)
result = re_text.split(' ')
print("result:"+result[5])
res_num =result[5]
print("res_num")
if res_num == "":
return 0
data=open_excel(bugpath)
table=data.sheet_by_name("Search Results")
nrows=table.nrows #total rows
print("nrows:"+str(nrows))
if str(nrows-1) == res_num:
return 1
else:
return 0
def check_exists_by_ID(ID):
try:
browser.find_element_by_id(ID).click()
except ElementNotVisibleException:
return 0
return 1
def open_excel(file):
try:
data = xlrd.open_workbook(file)
return data
except Exception:
print ("excel open err")
def get_data_by_tbname(file,tablename='CiSCO_BUG_INI'):
data=open_excel(file)
table=data.sheet_by_name(tablename)
nrows=table.nrows #total rows
#ncols = table.ncols #列数
#colnames = table.row_values(2) #2 row data
list=[]
for i in range(1,nrows):
if table.cell(i,8).value == 'true':
app={}
app['kata']=str(table.cell(i,0).value)
app['num']=str(table.cell(i,1).value)
#app['prname']=str(table.cell(i,2).value)
#app['fullprname']=str(table.cell(i,3).value)
app['prID']=str(table.cell(i,4).value)
#app['sftype']=str(table.cell(i,5).value)
app['ver']=str(table.cell(i,6).value)
app['fun']=str(table.cell(i,7).value)
#app['flag']=str(table.cell(i,8).value)
app['prouctname']=str(table.cell(i,9).value)
app['funkey'] = table.cell(i,10).value
app['statusVal'] = table.cell(i,11).value
app['severityVal'] = table.cell(i,12).value
#print(app['prouctname'])
list.append(app)
return list
def writelog(context):
file_object = open(os.path.abspath('.')+'\\log.txt','a')
try :
file_object.write(time.ctime()+":"+context+'\n')
finally:
file_object.close( )
def copy_bug_search_to(downloadfile,desfolder):
if not os.path.exists(desfolder):
os.makedirs(desfolder)
copy(downloadfile, desfolder)
def getexecl(keyword,desfolder):
if os.path.exists(downfile):
os.remove(downfile)
if not os.path.exists(desfolder):
os.makedirs(desfolder)
if keyword == 'Active/Standby':
keyword = 'Active_Standby'
if keyword =="Active/Active":
keyword = "Active_Active"
if keyword =="" or keyword =="*":
filename='bugsearch.xls'
pngfile =desfolder+"\\" + str(time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))+".png"
else:
filename='bugsearch_'+keyword+'.xls'
pngfile =desfolder+"\\" + str(time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))+"_"+keyword+".png"
print("check_load_finish()"+str(check_load_finish()))
if not check_load_finish():
time.sleep(5)
if not check_load_finish():
writelog("Err:Load Uncompleted "+desfolder+'\\'+keyword)
return False
browser.get_screenshot_as_file(pngfile)
writelog(pngfile)
if check_exists_by_ID("exportToEcelHelp"):
#browser.find_element_by_id("exportToEcelHelp").click()
time.sleep(5)
print(downfile)
if os.path.exists(downfile):
copy_bug_search_to(downfile,desfolder)
os.rename(desfolder+'\\'+'bugsearch.xls',desfolder+'\\'+filename)
if check_results_of_bug(browser,desfolder+'\\'+filename) == 1:
writelog("OK!! checked")
print("OK!! checked")
else:
writelog("NG!! checked ")
print("NG!! checked")
global ERRFLG
ERRFLG=1
else:#try again to copy downded file
time.sleep(8)
if os.path.exists(downfile):
copy_bug_search_to(downfile,desfolder)
os.rename(desfolder+'\\'+'bugsearch.xls',desfolder+'\\'+filename)
if check_results_of_bug(browser,desfolder+'\\'+filename) == 1:
writelog("OK!! checked")
print("OK!! checked")
else:
writelog("NG!! checked ")
print("NG!! checked")
#global ERRFLG
ERRFLG=1
else:
print("Err:"+desfolder+'\\'+keyword)
writelog("Err:"+desfolder+'\\'+keyword)
#global ERRFLG
ERRFLG=1
else:
print("no excel export")
writelog(desfolder+'\\'+keyword+':no excel export')
def getdata(desfolder,keyword,pf,ID,releaseText,sb='anfr',mDt=4,sts='fd',svr='2nH'):
if keyword =="" or keyword =="*":
browser.get('https://tools.cisco.com/bugsearch/search?kw='+keyword+'&pf='+pf+'&pfVal='+ID+'&rls='+releaseText+'&mDt='+mDt+'&sts='+sts+'&svr='+svr+'&sb=anfr&srtBy=byRel')
time.sleep(5)
getexecl(keyword,desfolder)
else:
keyword = keyword.split(',')
for kw in keyword:
browser.get('https://tools.cisco.com/bugsearch/search?kw='+kw+'&pf='+pf+'&pfVal='+ID+'&rls='+releaseText+'&mDt='+mDt+'&sts='+sts+'&svr='+svr+'&sb=anfr&srtBy=byRel')
time.sleep(5)
getexecl(kw,desfolder)
###########################
cruentpath= os.path.abspath('.')
downfile = r'C:\Users\111111\Downloads\bugsearch.xls'
table=get_data_by_tbname(cruentpath+'\\Cisco_Bugsearch_ini_No(61).xls','CiSCO_BUG_INI')
profile = webdriver.FirefoxProfile(r"C:\Users\111111\AppData\Roaming\Mozilla\Firefox\Profiles\s1t5dj6p.default")
#profile.native_events_enabled = True
browser = webdriver.Firefox(profile)
#login
browser.get("https://sso.cisco.com/autho/forms/CDClogin.html")
elem1 = browser.find_element_by_name("userid")
elem2 = browser.find_element_by_name("password")
elem1.send_keys("userid")
elem2.send_keys('password')
elem2.submit()
#print(cruentpath)
for i in range(len(table)):
if os.path.exists(downfile):
os.remove(downfile)
if table[i]['severityVal'] == "1":
svr='1'
if table[i]['severityVal'] == "2 or higher":
svr='2nH'
if table[i]['severityVal'] == "3 or higher":
svr='3nH'
if table[i]['severityVal'] == "4 or higher":
svr='4nH'
if table[i]['severityVal'] == "5 or higher":
svr='5nH'
if table[i]['severityVal'] == "6 or higher":
svr='6nH'
if table[i]['prouctname'] == 'se':
pf='sr'
else:
pf='prdNm'
sb='anfr'
mDt='4'#Last year
statusvalue ={'Fixed':"fd","Open":"open","Terminated":'tmd',"Other":"otr"}
'''
if table[i]['statusVal']== 'Fixed':
sts='fd'
if table[i]['statusVal']== 'Open':
sts='open'
if table[i]['statusVal']== 'Terminated':
sts='tmd'
if table[i]['statusVal']== 'Other':
sts='otr'
'''
sts=statusvalue[table[i]['statusVal']]
desfolder=cruentpath+'\\'+table[i]['kata']+'\\'+table[i]['num']
if table[i]['fun'] == "No":
kw="*"
getdata(desfolder,kw,pf,table[i]['prID'],table[i]['ver'],sb,mDt,sts,svr)
elif table[i]['fun'] == "Yes":
keywordlist = table[i]['funkey']
if keywordlist == '':
print("No key words")
writelog("No key words")
else:
getdata(desfolder,keywordlist,pf,table[i]['prID'],table[i]['ver'],sb,mDt,sts,svr)
else:
print ("Fun Flag err")
writelog("Fun Flag err")
#browser.quit()
global ERRFLG
if ERRFLG==0:
print('sucess!')
writelog('sucess!')
else:
print("Pls check NG or ERR ")
writelog("Pls check NG or ERR ")