使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档
#coding=utf-8
from time import sleep
import unittest
from selenium import webdriver
from selenium.webdriver import Remote
from selenium.webdriver.common.by import By#元素定位
import sys
def browser():#启动浏览器驱动
#driver = webdriver.Ie()
driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'platform':'ANY',
'browserName':'firefox',
'version':'',
})
return driver
class MyTest(unittest.TestCase):#框架
def setUp(self):
print("开始执行用例!")
self.driver = browser()
self.driver.implicitly_wait(10)
self.driver.maximize_window()
def tearDown(self):
self.driver.quit()
print('用例执行结束!')
class Page(object):#基础类
'''
页面基础类,用于所有页面的继承
'''
bbs_url = 'http://www.pm25.com/shanghai.html'
def __init__(self,selenium_driver,base_url=bbs_url,parent=None):#初始化
self.base_url = base_url
self.driver = selenium_driver
self.timeout = 30
self.parent = parent
def on_page(self):#断言url是否相等
return self.driver.current_url == (self.base_url + self.url)
def _open(self,url):
url = self.base_url + url
self.driver.get(url)
assert self.on_page(),'获取的url和当前url不匹配.url:%s' % url
def open(self):#打开浏览器
self._open(self.url)
def find_element(self,*loc):#单个元素定位
return self.driver.find_element(*loc)
def find_elements(self,*loc):#多个元素定位
return self.driver.find_elements(*loc)
class PM25(Page):#页面对象封装
u'''豆瓣读书排序'''
url = '/'
#元素定位
bbs_city_loc = (By.XPATH,'//div/div[1]/h2')#城市名称
bbs_pmindex_loc = (By.XPATH,'//div[6]/div/div[3]/div[1]/a')#PM2.5指数
#元素封装
def bbs_city(self):#城市名称
cityname = []
pmurls = ['http://www.pm25.com/shanghai.html','http://www.pm25.com/beijing.html','http://www.pm25.com/shenzhen.html','http://www.pm25.com/guangzhou.html']
for i in pmurls:
self.driver.get(i)
_input = self.driver.find_elements(*self.bbs_city_loc)# 选择页面上所有的tag name 为input 的元素
for j in _input:
cityname.append(j.text)#取出值并添加到数组
else:
sleep(1)
return cityname
def bbs_pm25(self):#城市指数
citypm25 = []
pmurls = ['http://www.pm25.com/shanghai.html','http://www.pm25.com/beijing.html','http://www.pm25.com/shenzhen.html','http://www.pm25.com/guangzhou.html']
for i in pmurls:
self.driver.get(i)
_input = self.driver.find_elements(*self.bbs_pmindex_loc)# 选择页面上所有的tag name 为input 的元素
for j in _input:
citypm25.append(int(j.text))#取出值并添加到数组
else:
sleep(1)
return citypm25
def out_node(self):#排序
list1 = self.bbs_city()
list2 = self.bbs_pm25()
list = dict(zip(list1,list2))#(map(lambda x,y:[x,y], list1,list2))
print("list:%s"%list)
dict1= sorted(list.items(),key=lambda item:item[1])#从小到大排序
print('从小到大排序:%s'%dict1)
return dict1
def writetxt(self):#写入txt文件
a = self.out_node()
b = list(a)
for c in b:
b[b.index(c)] = list(c)#将元组内嵌列表转换为列表
print(b)
d = [ str(i) for i in b ]#将所有int类型转换为str类型
print(d)
f1 = open('a.txt','w')
for i in d:#循环读取内嵌列表
print(i)#分别打印内嵌列表里的列表
f1.writelines(i)#写入txt文件
f1.write('\n')#写入文件时换行
f1.close()
class test_Douban_film(MyTest):
u'''pm2.5排序'''
def test1(self):
u'''pm2.5排序并写入txt文件'''
p1 = PM25(self.driver)
p1.open()
p1.writetxt()
if __name__ == '__main__':
unittest.main()
使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档的更多相关文章
- 一个简易的Python爬虫,将爬取到的数据写入txt文档中
代码如下: import requests import re import os #url url = "http://wiki.akbfun48.com/index.php?title= ...
- 搭建谷歌浏览器无头模式抓取页面服务,laravel->php->python->docker !!!
背景: 公司管理系统需要获取企业微信页面的配置参数如企业名.logo.人数等信息并操作,来隐藏相关敏感信息并自定义简化企业号配置流程 第一版已经实现了扫码登录获取cookie,使用该cookie就能获 ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- selenium page object模式
页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...
- 转 Page Object模式
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...
- UI自动化测试的Page Object模式
在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...
- 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中
下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM). 为什么要POM 用UiAutomator启动UI自动化测试不是一件困难的任务.你 ...
随机推荐
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- 企业做数据缓存是使用Memcached还是选Redis?
企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...
- Visual Studio:error MSB8020(搬运)
状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...
- Javascript高性能编程-提高Dom访问速度
在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...
- XSS 前端防火墙 —— 天衣无缝的防护
上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...
- 如何使用RobotFramework编写好的测试用例
如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...
- 如何利用 Visual Studio 自带工具提高开发效率
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...
- CSharpGL(15)用GLSL渲染2种类型的文字
CSharpGL(15)用GLSL渲染2种类型的文字 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合 ...
- C#-正则,常用几种数据解析-端午快乐
在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...
- # ios开发 @property 和 Ivar 的区别
ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...