博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析导航栏的url--selnium,beautifulsoup实战
阅读量:5377 次
发布时间:2019-06-15

本文共 4597 字,大约阅读时间需要 15 分钟。

    前段时间做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 webdriver10 from bs4 import BeautifulSoup11 12 # 登录url13 url = 'http://XXXX.XXXX.com/' # 系统的url14 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 content36 37     def _geturl(self,pagesource):38         """39         找出所有的a标签,然后筛选掉非导航连接的a标签。返回的是一个dict40         """41         result = dict()42         soup = BeautifulSoup(pagesource, "lxml")43         eles = soup.find_all("a")44         flag = 045         for ele in eles:46             if '#' in ele['href']:47                 continue48             tmp = ele.string49             if tmp is not None and '@' not in tmp:50                 flag += 151                 ele_url = ele['href'].split('?')[0]52                 # print('{0} ==> {1}'.format(tmp,ele_url))53                 result[tmp] = ele_url54 55         # print('Find out {0} datas.'.format(len(result)))56         return result57 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 time10 11 # 登录url12 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'] = href43                 result.append(tmp)44                 # print('name: {0},href: {1}'.format(name,href))45         return result46 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()

    好了,就到这里吧。。。

    

转载于:https://www.cnblogs.com/xiaoshitoutest/p/5940251.html

你可能感兴趣的文章
MS Access 按时间段查询数据
查看>>
算法待补全
查看>>
.Net4.0 任务(Task)
查看>>
Part 1 从NHibernate认识ORM
查看>>
TypeScript和JavaScript的一些小技巧记录
查看>>
初学数据结构四
查看>>
flask实战-个人博客-视图函数
查看>>
机器翻译数据集
查看>>
<cpp 从零学起:1>输出100内素数
查看>>
初入servlet:Allocate exception for servlet
查看>>
CSU1911 Card Game 【FWT】
查看>>
使用storyboard实现页面跳转,简单的数据传递
查看>>
Android窗口管理服务WindowManagerService显示窗口动画的原理分析
查看>>
工程android配置windows7下cocos2d-x、android的开发环境
查看>>
参数展示初始三层架构
查看>>
项目视频光盘项目中所学概览-html5+批处理+bat转exe
查看>>
hdu 1028
查看>>
思考技术 (一) —— 什么是新技术
查看>>
ubuntu更改源为aliyun的源;ROS改为新加坡源
查看>>
正则表达式入门
查看>>