python 導航欄_解析導航欄的url--selnium,beautifulsoup實戰

前段時間做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()

好了,就到這里吧。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PNG圖片詳解

1、PNG圖片類型 PNG格式有8位、24位、32位三種,下面是一些術語: 索引透明:類似于GIF,某一像素只有全透和全不透明兩種效果Alpha透明:半透明PNG8 8位的PNG最多支持256(2的8次方)種顏色&#xff0…

Java并發編程之顯式鎖(Lock)使用

又是一個基于AQS好用的類,看來下次有必要看看AQS了,正好又是放假。 既然叫顯式鎖,必然也有隱式鎖,也就是所謂的synchronzied關鍵字,它們兩者的區別呢在于使用范圍,synchronzied關鍵字的使用范圍比Lock要小…

python pychart三維_詳解python模塊pychartdir安裝及導入問題

在遷移別人寫好的腳本時,發現pychartdir沒有導入,腳本執行報錯。以下是報錯內容:[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安裝和使用

Ctags是一個用來為源文件中的標識符(如變量、函數、類成員、宏定義等)創建索引文件的程序。這些tags文件能被編輯器或其它工具用來快速查找定位源代碼中的符號(tag/symbol),如變量名,函數名等。 Tags文件中…

Java并發編程之AbstractQueuedSynchronizer(AQS)源碼解析

自己一個人隨便看看源碼學習的心得,分享一下啦,不過我覺得還是建議去買本Java并發編程的書來看會比較好點,畢竟個人的理解有限嘛。 獨占鎖和共享鎖 首先先引入這兩個鎖的概念:獨占鎖即同一時刻只有一個線程才能獲取到鎖&#xf…

采集用python還是火車頭_我才知道爬蟲也可以醬紫--火車采集器

我才知道爬蟲還可以這樣—火車采集器的使用說在前面額。。。好吧,我這一個三毛錢的屌絲也開始步入實習階段了,在北京其實也挺好的,雖說壓力大,但是今后就業機會也相對而言大一些。好了,說回今天的主題,之前…

mvn 使用中的錯誤

出現這種錯誤的時候:mvn Error building POM may not be this projects POM,報的是那個jar 包,就刪除那個jar 包,重新mvn clean install .ok

Java并發編程之FutureTask源碼解析

上次總結一下AQS的一些相關知識,這次總結了一下FutureTask的東西,相對于AQS來說簡單好多呀 之前提到過一個LockSupport的工具類,也了解一下這個工具類的用法,這里也鞏固一下吧 /*** Makes available the permit for the given th…

java 刪除二維數組中的null_避免在Java中檢查Null語句

1.概述通常,在Java代碼中處理null變量、引用和集合很棘手。它們不僅難以識別,而且處理起來也很復雜。事實上,在編譯時無法識別處理null的任何錯誤,會導致運行時NullPointerException。在本教程中,我們將了解在Java中檢…

Java并發編程之并發容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相關代碼,感覺JDK1.7和JDK1.8差別挺大的,這次先看下JDK1.7是怎么實現的吧 哈希(hash) 先了解一下啥是哈希(網上有很多介紹),是一種散列函數,簡單來…

帶控制端的邏輯運算電路_分別完成正整數的平方、立方和階乘的運算verilog語言...

練習:設計一個帶控制端的邏輯運算電路,分別完成正整數的平方、立方和階乘的運算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…

Java并發編程之并發容器ConcurrentHashMap(JDK1.8)解析

這個版本ConcurrentHashMap難度提升了很多,就簡單的談一下常用的方法就好了,可能有些講的不太清楚,麻煩發現的大佬指正一下 主要數據結構 1.8將Segment取消了,保留了table數組的形式,但是不在以HashEntry純鏈表的形式…

simulink顯示多個數據_如何在 Simulink 中使用 PID Tuner 進行 PID 調參?

作者 | 安布奇責編 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文為一篇技術干貨,主要講述在Simulink如何使用PID Tuner進行PID調參。PID調參器( PIDTuner)概述1.1 簡介使用PID Tuner可以對Simulink模型中的PID控制器,離散PID控制器,兩自由度PID控制…

Java并發編程之堵塞隊列介紹以及SkipList(跳表)

堵塞隊列 先了解一下生產者消費者模式: 生產者就是生產數據的一方,消費者就是消費數據的另一方。在多線程開發中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完,才能繼…

python生成list的時候 可以用lamda也可以不用_python 可迭代對象,迭代器和生成器,lambda表達式...

分頁查找#5.隨意寫一個20行以上的文件(divmod)# 運行程序,先將內容讀到內存中,用列表存儲。# l []# 提示:一共有多少頁# 接收用戶輸入頁碼,每頁5條,僅輸出當頁的內容def read_page(bk_list,n,endlineNone):startline …

數據挖掘技術簡介[轉]

關鍵詞: 關鍵詞:數據挖掘 數據集合 1. 引言  數據挖掘(Data Mining)是從大量的、不完全的、有噪聲的、模糊的、隨機的數據中提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識的過程。隨…

樹莓派安裝smbus_樹莓派使用smbus不兼容問題(no module named 'smbus')

樹莓派使用smbus不兼容問題(no module named ‘smbus’)python3.5–3.6可以使用smbus2代替smbus1. 先參考以下方法:github討論樹莓派社區2.Pypi上可以下載smbus2smbus2PyPi介紹:當前支持的功能有:獲取i2c功能(I2C_FUNCS)read_bytewrite_byter…

Java并發編程之線程池ThreadPoolExecutor解析

線程池存在的意義 平常使用線程即new Thread()然后調用start()方法去啟動這個線程,但是在頻繁的業務情況下如果在生產環境大量的創建Thread對象是則會浪費資源,不僅增加GC回收壓力,并且還浪費了時間,創建線程是需要花時間的&…

面向過程的門面模式

{*******************************************************}{ }{ 業務邏輯一 }{ }{ 版權所有 (C) 2008 陳…

Java并發編程之線程定時器ScheduledThreadPoolExecutor解析

定時器 就是需要周期性的執行任務,也叫調度任務,在JDK中有個類Timer是支持周期性執行,但是這個類不建議使用了。 ScheduledThreadPoolExecutor 繼承自ThreadPoolExecutor線程池,在Executors默認創建了兩種: newSin…