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.mzph.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…