前段時間做ui自動化測試的時候,導航欄菜單始終有點問題,最后只好直接獲取到url,然后直接使用driver.get(url)進入頁面;
包括做壓測的時候,比如我要找出所有報表菜單的url,這樣不可能手動去一個一個找出來,然后復制,這樣浪費時間,并且也容易漏掉,所以我就寫了個腳本來干這事;
首先說下思路:登錄-->獲取所有的a標簽-->篩選掉不用的標簽-->打印或者保存到文件中
其中我獲取頁面所有的標簽使用了兩種方法,webdriver和beautifulsoup4,兩種的區別:1、beautifulsoup4來解析的時候,比較穩定,并且速度快,2、webdriver可能簡單一點吧,我推薦是用beautifulsoup4;之所以是用webdriver登錄,是因為用webdriver登錄簡單,不像requests來請求的話,第一次還要分析url,參數之類的,用webdriver的話,只需要定位幾個元素就ok了,何樂而不為呢。。。
下面我將兩種方式的運行時間、最終的解析結果:
下面的是第一種方式:使用beautifulsoup4來解析:
1 #coding=utf-8
2
3 """
4 是為了獲取XXX系統菜單的url
5 使用的是selenium登錄,獲取網頁的內容,然后用beautifulsoup來解析
6 """
7 import unittest
8 import time
9 from selenium import webdriver
10 from bs4 import BeautifulSoup
11
12 # 登錄url
13 url = 'http://XXXX.XXXX.com/' # 系統的url
14 username = 'XXXX'
15 password = 'XXXXX'
16
17 class GetUrl(unittest.TestCase):
18 def setUp(self):
19 self.dr = webdriver.Chrome()
20 self.dr.get(url)
21
22 def tearDown(self):
23 self.dr.quit()
24
25 def _login(self):
26 self.dr.find_element_by_id('username').send_keys(username) # 輸入用戶名
27 self.dr.find_element_by_id('password').send_keys(password) # 輸入密碼
28 # self.dr.find_element_by_id('verifycode').send_keys('XXXXX') 這里原來是需要驗證碼的,后來取消掉了
29 self.dr.find_element_by_id('weblogin').click() # 點擊登錄按鈕
30 time.sleep(3)
31
32 def _gethtmlcontent(self):
33 """獲取當前頁面的html的所有內容"""
34 content = self.dr.page_source # 將該頁面的內容 返回給content保存起來方便后面解析
35 return content
36
37 def _geturl(self,pagesource):
38 """
39 找出所有的a標簽,然后篩選掉非導航連接的a標簽。返回的是一個dict
40 """
41 result = dict()
42 soup = BeautifulSoup(pagesource, "lxml")
43 eles = soup.find_all("a")
44 flag = 0
45 for ele in eles:
46 if '#' in ele['href']:
47 continue
48 tmp = ele.string
49 if tmp is not None and '@' not in tmp:
50 flag += 1
51 ele_url = ele['href'].split('?')[0]
52 # print('{0} ==> {1}'.format(tmp,ele_url))
53 result[tmp] = ele_url
54
55 # print('Find out {0} datas.'.format(len(result)))
56 return result
57
58 def _writetotxt(self,contents):
59 """
60 將結果寫入文件中
61 """
62 print('寫入開始')
63 with open('urlcontent.txt','w') as f:
64 for title,value in contents.items():
65 f.write('{0} ==> {1}\n'.format(title,value))
66 print('寫入完畢')
67
68 def test_run(self):
69 self._login()
70 pagesources = self._gethtmlcontent()
71 result = self._geturl(pagesources)
72 self._writetotxt(result)
73
74
75 if __name__ == '__main__':
76 unittest.main()
第二種全都是使用webdriver來解析的:
1 #coding=utf-8
2
3 """
4 是為了獲取XXX系統菜單的url
5 使用的是selenium登錄,查找元素,獲取元素的屬性
6 """
7 from selenium import webdriver
8 import unittest
9 import time
10
11 # 登錄url
12 url = 'http://XXX.XXX.com/'
13 username = 'XXX'
14 password = 'XXX'
15
16 class GetUrl(unittest.TestCase):
17 def setUp(self):
18 self.dr = webdriver.Chrome()
19 self.dr.get(url)
20
21 def tearDown(self):
22 self.dr.quit()
23
24 def _login(self):
25 # time.sleep(2)
26 self.dr.find_element_by_id('username').send_keys(username)
27 self.dr.find_element_by_id('password').send_keys(password)
28 # self.dr.find_element_by_id('verifycode').send_keys('XXXXX')
29 self.dr.find_element_by_id('weblogin').click()
30 time.sleep(3)
31
32 def _geturl(self):
# 這里返回的是一個list,然后里面是一個個字典
33 result = list()
34 eles = self.dr.find_elements_by_css_selector('menu.u-menu a')
35 for ele in eles:
36 tmp = dict()
37 href = ele.get_attribute('href').split('?')[0]
38 # 獲取菜單 的名稱
39 name = ele.get_attribute('innerHTML')
40 if "" not in name:
41 tmp['name'] = name.strip()
42 tmp['href'] = href
43 result.append(tmp)
44 # print('name: {0},href: {1}'.format(name,href))
45 return result
46
47 def _writetotxt(self,contents):
48 print("一共{0}條數據".format(len(contents)))
49 print('寫入開始')
50 with open('urlcontent.txt','w') as f:
51 for content in contents:
52 f.write('{0} ==> {1}\n'.format(content['name'],content['href']))
53 print('寫入完畢')
54
55 def test_run(self):
56 self._login()
57 self._writetotxt(self._geturl())
58
59
60 if __name__ == '__main__':
61 unittest.main()
好了,就到這里吧。。。