需求分析
友盟在统计我们产品的时候,后期由于版本太多,友盟又最多只能统计三十个,所以我们要找出用户数>40的部分,这一部分按照用户数排列,<40的部分按照版本号高地排序。好了,现在我们要驱动浏览器来自动做这件事
前提条件 Chrome浏览器和浏览器驱动器 如果你想用IE或者火狐的话可以自行百度找一下配置方法,我用的是google的chromedriver
Win+R输入cmd启动终端,输入python开始我们的python之旅
from selenium import webdriver
driver = 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').text
mtablen = 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 webdriver
from 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').text
mtablen = 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 webdriver
class 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 os
import sys
import time
import json
import shutil
from datetime import datetime
# /Users/babybus/Sites/python/django/myblog
cur_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