Python+Selenium友盟自动版本选择
来源:互联网 发布:淘宝专业版和智能版 编辑:程序博客网 时间:2024/05/17 08:58
需求分析
友盟在统计我们产品的时候,后期由于版本太多,友盟又最多只能统计三十个,所以我们要找出用户数>40的部分,这一部分按照用户数排列,<40的部分按照版本号高地排序。好了,现在我们要驱动浏览器来自动做这件事
前提条件 Chrome浏览器和浏览器驱动器 如果你想用IE或者火狐的话可以自行百度找一下配置方法,我用的是google的chromedriver
Win+R输入cmd启动终端,输入python开始我们的python之旅
from selenium import webdriverdriver = webdriver.Chrome()# 启动google浏览器driver.get("https://i.umeng.com/")# 去我们要去的网站
接下来我们要找登陆的账号输入框,密码输入框还有登陆按钮
键盘上按下F12开启浏览器的调试模式,右键账户输入框->审查元素->Copy Xpath这样我们就能得到这个元素的位置了
这时候我得到一个值 比如:
//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[1]/div/label/input
没错,找到输入框就是这么简单同样的道理也能找到密码输入框和登陆按钮
# 找到账户框输入账户hao = driver.find_element_by_xpath('//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[1]/div/label/input')hao.send_keys('账户名')# 找到密码框输入密码mima = driver.find_element_by_xpath('//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[2]/label/input')mima.send_keys('密码')# 找到登陆按钮点击driver.find_element_by_xpath('//*[@id="submitForm"]').click()
然后我们登陆我们的产品页面
可以点击查看报表应用授权列表也可以直接访问网址
http://mobile.umeng.com/apps?show_all=true
现在显示我们的所有产品了,要把所有产品名字和链接记录下来,这个我们后面说
先说我们要做的事情,找到一款产品点击进去–>功能使用–>页面访问路径–>管理版本
driver.get("http://mobile.umeng.com/apps/27710022f0e85e76120eb375/reports/path")# 然后点击一款产品-->功能使用-->页面访问路径-->管理版本driver.find_element_by_link_text(u'功能使用').click()driver.find_element_by_link_text(u'页面访问路径').click()sleep(0.5)try: guanli = driver.find_element_by_xpath('//*[@id="mainContainer"]/div/div[6]/span').click()except Exception as e: guanli = driver.find_element_by_link_text(u'管理版本').click()
左边是已经选择的版本,右边是还未选择的版本,我们发现要把左边先勾选到右边才会显示活跃用户数,所以现在要先把左边勾选到右边
经过分析我们可以一次性得到左边的全部数据
# 得到左边正在统计的全部数据mstr = driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul').textmtablen = len(mstr.split('\n')) if len(mstr.strip()) < 2: mtablen = 0# 把所有已选版本勾选过来for x in range(0,mtablen): menu = driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul/li[1]').click() driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul/li[1]/span').click() sleep(0.4)# 最后就能找到所有未选版本wei=driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[2]/section/table/tbody')weitxt = wei.text.split('\n')
以上代码的小结
# -*- coding:utf-8 -*-from selenium import webdriverfrom time import sleep# 打开google浏览器driver = webdriver.Chrome()# 去我们要去的网站driver.get("https://i.umeng.com/")# 找到账户框输入账户hao = driver.find_element_by_xpath('//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[1]/div/label/input')hao.send_keys('友盟账户名')# 找到密码框输入密码mima = driver.find_element_by_xpath('//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[2]/label/input')mima.send_keys('密码')# 找到登陆按钮点击driver.find_element_by_xpath('//*[@id="submitForm"]').click()sleep(1)# 然后我们登陆我们的产品页面 可以点击查看报表应用授权列表也可以直接访问网址# driver.get("http://mobile.umeng.com/apps/authorised_apps?show_all=true")driver.get("http://mobile.umeng.com/apps/27710022f0e85e76120eb375/reports/path")# 然后点击一款产品-->功能使用-->页面访问路径-->管理版本driver.find_element_by_link_text(u'功能使用').click()driver.find_element_by_link_text(u'页面访问路径').click()sleep(0.5)try: guanli = driver.find_element_by_xpath('//*[@id="mainContainer"]/div/div[6]/span').click()except Exception as e: guanli = driver.find_element_by_link_text(u'管理版本').click()sleep(0.5)# 得到左边正在统计的全部数据mstr = driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul').textmtablen = len(mstr.split('\n')) if len(mstr.strip()) < 2: mtablen = 0# 把所有已选版本勾选过来for x in range(0,mtablen): menu = driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul/li[1]').click() driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul/li[1]/span').click() sleep(0.4)
最后附上封装成类的版本
# -*- coding:utf-8 -*-from cminit import *from selenium import webdriverclass DriverUmeng(object): """docstring for DriverUmeng""" def __init__(self,args): self.args = args # 毕竟我有很多账号,根据账户名区别是最好的选择 self.savename = self.args['username'].replace('@','_').replace('.','_') if not os.path.exists(os.path.join(mydata,'umeng')): os.makedirs(os.path.join(mydata,'umeng')) # 所有产品信息记录 self.All_items_json = os.path.join(mydata,'umeng',self.savename+'All_items.json') # 处理记录,如果中间出现中断重新执行就跳过之前已经执行成功的了 self.Handle_Result_Json = os.path.join(mydata,'umeng',self.savename+'Handle_Result.json') if self.args['clean'] == 'yes': if os.path.exists(self.Handle_Result_Json): f = open(self.Handle_Result_Json) Handle_Result = json.load(f) f.close() new_Handle_Result = {} for x in Handle_Result: if Handle_Result[x]['result'] == 'Success': new_Handle_Result[x] = Handle_Result[x] f = open(self.Handle_Result_Json,'wb') json.dump(new_Handle_Result,f) f.close() self.which = 1 self.login() self.GetAllMsg() # 登陆 def login(self): self.driver = webdriver.Chrome() self.driver.get('https://i.umeng.com/') TryUntilFind(self.driver,'//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[1]/div/label/input').send_keys(self.args['username']) TryUntilFind(self.driver,'//*[@id="ump"]/div[1]/div/form/div[1]/ul/li[2]/label/input').send_keys(self.args['password']) TryUntilFind(self.driver,'//*[@id="submitForm"]').click() time.sleep(0.5) if self.driver.current_url != r"https://i.umeng.com/user/products": time.sleep(1) if self.driver.current_url != r"https://i.umeng.com/user/products": raise Exception(u'登陆失败') print('Success Login') # 获取所有产品的信息 def GetAllMsg(self): All_items = [] if os.path.exists(self.All_items_json): All_items_dic = json.load(open(self.All_items_json)) if ( time.time()-All_items_dic['time'] ) < 172800: All_items = All_items_dic['All_items'] if len(All_items) == 0: self.driver.get('http://mobile.umeng.com/apps?show_all=true') TryUntilFind(self.driver,'//*[@id="data-list"]/tr[1]/td[2]/a[1]') # 获取所有产品的信息 finds = self.driver.find_elements_by_xpath('//*[@id="data-list"]/tr') for i,v in enumerate(finds): # 找到这个元素的a标签 这里有应用名和链接 afind = v.find_element_by_css_selector('.appname a') appname = afind.text href = afind.get_attribute('href') message = {'href':href,'appname':appname,'which':i} All_items.append(message) nowtime = datetime.now().strftime("%Y_%m_%d_%H_%M") result = {'nowtime':nowtime,'time':time.time(),'All_items':All_items} json.dump(result,open(self.All_items_json,'w')) self.All_items = All_items # 每隔十个记录一次结果 无论成功与否,有记录的下一次跳过这些记录去执行 Handle_Result = {} if os.path.exists(self.Handle_Result_Json): f = open(self.Handle_Result_Json) Handle_Result = json.load(f) f.close() for i,message in enumerate(self.All_items): if not Handle_Result.has_key(str(i)): result = {'result':'start'} if i < 999: try: result = self.Handle(message) except Exception, e: result = {'result':'Failer','err':str(e),'message':message} print result Handle_Result[str(i)] = result f = open(self.Handle_Result_Json,'wb') json.dump(Handle_Result,f) f.close() self.Handle_Result = Handle_Result self.ChooseOver() # 处理网页 def Handle(self,message): result = {'result':'start'} self.driver.get(message['href']) time.sleep(1) # if message['which'] == 0: if self.which == 1: try: self.driver.find_element_by_xpath('/html/body/div[6]/div[1]/a/span').click() except Exception, e: pass finally: self.which = 2 # 功能使用 TryUntilFind(self.driver,u'功能使用','find_element_by_link_text').click() # 页面访问路径 TryUntilFind(self.driver,u'页面访问路径','find_element_by_link_text').click() # 管理版本 try: time.sleep(0.5) guanli = self.driver.find_element_by_xpath('//*[@id="mainContainer"]/div/div[6]/span').click() # time.sleep(0.5) except Exception,e: TryUntilFind(self.driver,u'管理版本','find_element_by_link_text').click() # 已选版本 already = TryUntilFind(self.driver,'//*[@id="versions-dialog"]/div/section[1]/ul/li','find_elements_by_xpath') print 'already',len(already) NoChoose = self.driver.find_elements_by_xpath('//*[@id="versions-dialog"]/div/section[2]/section/table/tbody/tr') print('NoChoose',len(NoChoose)) all_version = len(already)+len(NoChoose)-1 print 'allversion',all_version if all_version <= 30: if len(NoChoose) > 1: for x in xrange(1,len(NoChoose)): NoChoose[len(NoChoose)-x].click() already = self.driver.find_element_by_xpath('//*[@id="versions-dialog"]/div/section[1]/ul').text choose = already.split('\n') result = {'result':'Success','choose':'choose'} else: # 把所有已选版本勾选过来 if len(already) > 1: for x in already: x.click() time.sleep(0.2) x.find_element_by_xpath('span').click() time.sleep(0.2) # 重新找到所有未选的版本 NoChoose = self.driver.find_elements_by_xpath('//*[@id="versions-dialog"]/div/section[2]/section/table/tbody/tr') Part1 = [] Part2 = [] print 'devide part' # 先拆分成两部分 用户数>60的 前面部分根据人数排序后面的根据版本 for i,v in enumerate(NoChoose): if i > 0: tmptab = v.find_elements_by_xpath('td') version = tmptab[0].text people = tmptab[1].text tmptab = [version,people,i] if int(people) > 40: Part1.append(tmptab) else: Part2.append(tmptab) sorttab1 = sorted(Part1,key=lambda asd:int(asd[1]),reverse=True) sorttab2 = sorted(Part2,reverse=True) choose = (sorttab1+sorttab2)[0:30] # print 'choose',choose NoChoose = self.driver.find_elements_by_xpath('//*[@id="versions-dialog"]/div/section[2]/section/table/tbody/tr') for x in choose: NoChoose[x[2]].click() # 点击关闭按钮 try: self.driver.find_element_by_class_name('ui-dialog-titlebar-close').click() except Exception,e: pass result = {'result':'Success','choose':'choose'} return result def ChooseOver(self): self.driver.quit() import urllib2 # 结束的时候如果有 Failer错误 把错误告诉我 errjson = os.path.join(mydata,'umeng',self.savename+'.json') err_record = {} for i,v in enumerate(self.Handle_Result): if self.Handle_Result[v]['result'] != 'Success': err_record[v] = self.Handle_Result[v] json.dump(err_record,open(errjson,'w')) # 通过我开的qq接口把结果告诉管理员 if len(err_record) > 0: urlPath = r'http://10.1.0.50:8000/test/?who=2&msg=%s'%self.savename+'_failer' urllib2.urlopen(urlPath) else: urlPath = r'http://10.1.0.50:8000/test/?who=2&msg=%s'%self.savename+'_Success' urllib2.urlopen(urlPath)def main(which,clean): username = '友盟账户1' password = '密码1' # 2.android 3.ios 4.and google ,'7':['osesite@gmail.com','sinyee4site'] worddic = {'2':['友盟账户2','密码2'],'3':['友盟账户3','密码3']} if which != '1': username = worddic[which][0] password = worddic[which][1] args = {'username':username,'password':password,'clean':clean} DriverUmeng(args)if __name__ == '__main__': main('1','yes')
再附上cminit.py,这个我得通用引用
# -*- coding:utf-8 -*-import osimport sysimport timeimport jsonimport shutilfrom datetime import datetime# /Users/babybus/Sites/python/django/myblogcur_dir = sys.path[0]mydata = os.path.join(cur_dir,'mydata')alltemp = r'/Applications/XAMPP/xamppfiles/htdocs/media/alltemp'TEMP_DIR = os.path.join(cur_dir,'media','temp')def TryUntilFind(driver,element,findway='find_element_by_xpath',findTime=1): time.sleep(0.5) if findTime > 200: return 'Can\'t find' try: func = 'driver.%s(element)'%findway return eval(func) except Exception as e: time.sleep(0.5) return TryUntilFind(driver,element,findway,findTime+1)
如果有紧急问题可以留言在这里给我
或者邮箱429304451@qq.com
0 0
- Python+Selenium友盟自动版本选择
- Selenium Python 致友自动登陆
- selenium + Python 下拉框选择
- Mac selenium python版本安装
- python 中将selenium 版本降级
- Python Selenium 自动测试网页
- selenium+python自动登录脚本
- selenium python cookie 自动登陆
- python+Selenium自动签到实例
- Ubuntu选择python版本
- django python版本选择
- 如何选择python版本
- 指定版本安装selenium(python)
- python+selenium+firefox/chrome版本兼容问题记录
- selenium初探:Python+selenium实现QQ空间自动点赞
- 自动重启路由器 AutoIt + selenium + python
- selenium python --自动表单填写--学习笔记
- Python实现Selenium实现自动登录CSDN
- EasyUI Combobox获得焦点的使用方法
- CSS 页面置灰等待效果
- 使用命令行方式运行 JMeter 脚本
- 安卓反编译详解
- web tomcat配置多个host实例
- Python+Selenium友盟自动版本选择
- OSG资料汇总
- js lightbox展示图片的案例
- 批处理命令
- java 泛型中T和?的区别
- iOS 反编码地址获取是否在国内以及手机模拟定位
- 两个栈实现一个队列的算法
- linux命令之----chkconfig命令用于检查,设置系统的各种服务
- java 不同线程之间的切换(wait和notify)