解析导航栏的url

Posted 石涛涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析导航栏的url相关的知识,希望对你有一定的参考价值。

    前段时间做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 "<i>" 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()
复制代码

    好了,就到这里吧。。。

    

以上是关于解析导航栏的url的主要内容,如果未能解决你的问题,请参考以下文章

底部导航栏的 Oncreate 视图问题

将数据从活动传递到底部导航栏的片段

如何为导航到实现底部导航栏的活动中的上一个片段进行后推操作?

如何更改操作栏的标题?

使用导航组件时,片段 savedInstanceState 始终为空

底部导航图标不变