前段时间做ui自动化测试的时候,导航栏菜单始终有点问题,最后只好直接获取到url,然后直接使用driver.get(url)进入页面;

包括做压测的时候,比如我要找出所有报表菜单的url,这样不可能手动去一个一个找出来,然后复制,这样浪费时间,并且也容易漏掉,所以我就写了个脚本来干这事;

首先说下思路:登录-->获取所有的a标签-->筛选掉不用的标签-->打印或者保存到文件中

其中我获取页面所有的标签使用了两种方法,webdriver和beautifulsoup4,两种的区别:1、beautifulsoup4来解析的时候,比较稳定,并且速度快,2、webdriver可能简单一点吧,我推荐是用beautifulsoup4;之所以是用webdriver登录,是因为用webdriver登录简单,不像requests来请求的话,第一次还要分析url,参数之类的,用webdriver的话,只需要定位几个元素就ok了,何乐而不为呢。。。

下面我将两种方式的运行时间、最终的解析结果:

下面的是第一种方式:使用beautifulsoup4来解析:

 #coding=utf-8

 """
是为了获取XXX系统菜单的url
使用的是selenium登录,获取网页的内容,然后用beautifulsoup来解析
"""
import unittest
import time
from selenium import webdriver
from bs4 import BeautifulSoup # 登录url
url = 'http://XXXX.XXXX.com/' # 系统的url
username = 'XXXX'
password = 'XXXXX' class GetUrl(unittest.TestCase):
def setUp(self):
self.dr = webdriver.Chrome()
self.dr.get(url) def tearDown(self):
self.dr.quit() def _login(self):
self.dr.find_element_by_id('username').send_keys(username) # 输入用户名
self.dr.find_element_by_id('password').send_keys(password) # 输入密码
# self.dr.find_element_by_id('verifycode').send_keys('XXXXX') 这里原来是需要验证码的,后来取消掉了
self.dr.find_element_by_id('weblogin').click() # 点击登录按钮
time.sleep(3) def _gethtmlcontent(self):
"""获取当前页面的html的所有内容"""
content = self.dr.page_source # 将该页面的内容 返回给content保存起来方便后面解析
return content def _geturl(self,pagesource):
"""
找出所有的a标签,然后筛选掉非导航连接的a标签。返回的是一个dict
"""
result = dict()
soup = BeautifulSoup(pagesource, "lxml")
eles = soup.find_all("a")
flag = 0
for ele in eles:
if '#' in ele['href']:
continue
tmp = ele.string
if tmp is not None and '@' not in tmp:
flag += 1
ele_url = ele['href'].split('?')[0]
# print('{0} ==> {1}'.format(tmp,ele_url))
result[tmp] = ele_url # print('Find out {0} datas.'.format(len(result)))
return result def _writetotxt(self,contents):
"""
将结果写入文件中
"""
print('写入开始')
with open('urlcontent.txt','w') as f:
for title,value in contents.items():
f.write('{0} ==> {1}\n'.format(title,value))
print('写入完毕') def test_run(self):
self._login()
pagesources = self._gethtmlcontent()
result = self._geturl(pagesources)
self._writetotxt(result) if __name__ == '__main__':
unittest.main()

第二种全都是使用webdriver来解析的:

 #coding=utf-8

 """
是为了获取XXX系统菜单的url
使用的是selenium登录,查找元素,获取元素的属性
"""
from selenium import webdriver
import unittest
import time # 登录url
url = 'http://XXX.XXX.com/'
username = 'XXX'
password = 'XXX' class GetUrl(unittest.TestCase):
def setUp(self):
self.dr = webdriver.Chrome()
self.dr.get(url) def tearDown(self):
self.dr.quit() def _login(self):
# time.sleep(2)
self.dr.find_element_by_id('username').send_keys(username)
self.dr.find_element_by_id('password').send_keys(password)
# self.dr.find_element_by_id('verifycode').send_keys('XXXXX')
self.dr.find_element_by_id('weblogin').click()
time.sleep(3) def _geturl(self):
      # 这里返回的是一个list,然后里面是一个个字典
result = list()
eles = self.dr.find_elements_by_css_selector('menu.u-menu a')
for ele in eles:
tmp = dict()
href = ele.get_attribute('href').split('?')[0]
# 获取菜单 的名称
name = ele.get_attribute('innerHTML')
if "<i>" not in name:
tmp['name'] = name.strip()
tmp['href'] = href
result.append(tmp)
# print('name: {0},href: {1}'.format(name,href))
return result def _writetotxt(self,contents):
print("一共{0}条数据".format(len(contents)))
print('写入开始')
with open('urlcontent.txt','w') as f:
for content in contents:
f.write('{0} ==> {1}\n'.format(content['name'],content['href']))
print('写入完毕') def test_run(self):
self._login()
self._writetotxt(self._geturl()) if __name__ == '__main__':
unittest.main()

好了,就到这里吧。。。

解析导航栏的url--selnium,beautifulsoup实战的更多相关文章

  1. 解析导航栏的url

    前段时间做ui自动化测试的时候,导航栏菜单始终有点问题,最后只好直接获取到url,然后直接使用driver.get(url)进入页面: 包括做压测的时候,比如我要找出所有报表菜单的url,这样不可能手 ...

  2. day77:luffy:导航栏的实现&DjangoRestFramework JWT&多条件登录

    目录 1.导航栏的实现 2.登录前戏:用户表初始化 3.DjangoRestFramework JWT 4.多条件登录 5.登录状态的判断和退出登录 1.导航栏的实现 1.设计导航栏的model模型类 ...

  3. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  4. Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  5. Html5 学习笔记 【PC固定布局】 实战1 导航栏

    导航栏html文件: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=& ...

  6. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  7. Android ActionBar全然解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc.我翻译之后又做了些加工 ...

  8. 【转】Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  9. Bootstrap 学习笔记 项目实战 响应式导航栏

    导航代码HTML: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...

随机推荐

  1. Restful.Data v2.0发布,谢谢你们的支持和鼓励

    v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力. v2.0在除了细枝末节外,在功能上主要做了一下更新 ...

  2. DataTables 控件使用和心得 (1) - 入门

    什么是DataTables DataTables是一个基于HTML/CSS/JavaScript的前端列表组件. 基于JQuery 开源并且免费(除特殊支持服务) 主要特色: 高性能,响应式,功能完整 ...

  3. Java虚拟机4:内存溢出

    堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码 ...

  4. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  5. zend studio 常用快捷键

    zend studio是一款很棒的PHP语言编译器,强大的功能让很多程序员爱不释手,而快捷键更是程序员加快编写代码的利器,那么一起来看看有哪些好用的快捷键吧. 复制当前行:ctrl+alt+↓ 删除当 ...

  6. C#将dll打包到程序中

    最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...

  7. HyperDock,让Mac的窗口飞

    三年前写了一篇文章,介绍了Windows 7下的Aero效果,其实最终是想引出来写Mac OS上能产生类似功能的HyperDock应用程序,可惜这一拖,就拖到连Windows 10都快要发布了.没有关 ...

  8. AutoMapper的简单使用

    接触AutoMapper已经有两年多的时间了,在ORM框架中,它使持久层对象与DTO对象之间的转换变得相当简单. 随着负责的项目的增多,使用的技术框架一多起来,很多具体的技术点难免记不清, 加上同时兼 ...

  9. EF架构~为导航属性赋值时ToList()的替换方案

    回到目录 今天在进行EF开发时,遇到一个问题,在进行join查询时,类中的一个集合类型的导航属性,在给它赋值时,将查询出来的结果ToList()后,出错了,linq to entity不支持这种操作, ...

  10. 02- Shell脚本学习--运算符

    Shell运算符 Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 aw ...