2018-08-13

Python结合MySQLdb,urllib等库主要进行偏后台数据库的自动化测试,同时页面元素涉及处理表格元素,并将获取的表格内容进行处理。

u 如何遍历一个表格并获取表格中需要的内容

思路是先获得表格行(tr),再通过行遍历所有的列(td),从而获得每一行的内容放入一个列表,通过对列表的下标处理获得需要的内容。
""""""
table_tr_list=browser.find_element_by_xpath('//[@id="tab_con"]/div[1]/div[2]/table').find_elements_by_tag_name('tr')#******取得所有行*** table_list=[] #*****定义表格总内容列表* for tr in table_tr_list: table_td_list=tr.find_elements_by_tag_name('td')#****通过每一行寻找这一行中每一列的所有元素** row_list=[]
for td in table_td_list: row_list.append(td.text)#****将获得的每一个元素内容追加进****row_list****列表
table_list.append(row_list)#******将获得的每一行的列表放入******table_list******列表中*****combination_name=[]
for i in table_list:
if i==[]:
pass
else: k=i[0]
combination_name.append(k)#****取得需要的内容
*

u 数据库数据获得

当处理的数据涉及多个库时,只需要连接数据库中某一个库即可对数据库中所有表格进行操作,但是此时一些存储过程,表明等都需要加上databasename,比如表明用database_name.table_name来表示具体例子如下:

from selenium import webdriver
from time import sleep
import MySQLdb
import json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )#****使****python****可以认识非****ASC****编码,例如中文
browser=webdriver.Firefox()
browser.get("http:\master-test.simuwang.com")#****进入官网
browser.maximize_window()
sleep(5) browser.find_element_by_xpath(".//[@id='input_nick_lg']").send_keys(username)#****输入账号* browser.find_element_by_xpath("//[@id='input_pwd_lg']").send_keys(passwd)#****输入密码* browser.find_element_by_xpath(".//[@id='login_lgx']").click()#****点击登录* sleep(5)
browser.find_element_by_class_name('ignore').click()#****点击按钮关闭弹窗
js="var q=document.documentElement.scrollTop=800"
browser.execute_script(js)
table_tr_list=browser.find_element_by_xpath('//
[@id="tab_con"]/div[3]/div[2]/table').find_elements_by_tag_name('tr')
table_list=[]
for tr in table_tr_list:
table_td_list=tr.find_elements_by_tag_name('td')
row_list=[]
for td in table_td_list:
row_list.append(td.text)
table_list.append(row_list)
attention_company_name=[]#****取得页面表格中所有数据
* for i in table_list:
if i==[]:
pass
else:
attention_company_name.append(i[0])
connect=MySQLdb.connect(host='211.154.153.13',user='rz_cm_master',passwd='TbLuENLK',db='rz_combination_master',charset='gbk')
cursor=connect.cursor()
cursor.execute("SELECT company_short_name FROM rz_data_pool.company_information WHERE company_id IN ( SELECT company_id FROM rz_combination_master.cm_user_attention_company WHERE userid=(SELECT userid FROM rz_combination_master.cm_user WHERE cellphone=rz_combination_master.func_change_number('15818650780',1,1)))")#****从数据库中获取用户关注机构名字

此处只使用一个****connect****即实现了连接多个库的效果 result=cursor.fetchall()
list=[]
for i in result:
x=i[0]
y=x.split(',')[0]
list.append(y)
match_attention_company_name=0
for i in attention_company_name:
if i in list:
match_attention_company_name+=1
else:
print
"用户关注机构与数据库不匹配" break
if
match_attention_company_name==len(list):
print
"用户关注机构与数据库完全匹配"

u 涉及文件下载的处理

进行自动化过程中有些用例需要用到文件下载,但是下载过程中浏览器总是弹出窗口,但是这个窗口又属于系统窗口无法定位,所有只能用非常之法处理,因为我用的是火狐浏览器,所有一下火狐浏览器处理会清晰一些,谷歌浏览器只提供思路。

首先通过以下代码是没用的:

  1. profile = webdriver.FirefoxProfile()

  2. profile.set_preference('browser.download.dir','d:\')

  3. profile.set_preference('browser.download.folderList',2)

  4. profile.set_preference('browser.download.manager.showWhenStarting',False)

  5. profile.set_preference('browser.helperApps.neverAsk.saveToDisk','application/zip')

几经周折,最后找到的方法是重新建立一个firefox配置文件,使用配置文件打开浏览器并手动进行一次下载,下载后进去浏览器设置,改变下载路径和对应需下载文件类型的下载不提示设置,完了关闭。

建立配置文档流程如下:

开始à运行à输入firefox.exe –ProfileManagerà创建配置文件à设置配置文件路径(这里需要将配置文件路径记下来,最好手动输入吧- -!,页面整个路径就是配置文档的完整路径,后面需要用到)à保存à使用配置文件打开浏览器à下载与需要自动化验证下载的文件类型à点开浏览器设置à设置路径并查看对应文件类型是否已经默认不提示下载à关闭浏览器

image.png
image.png

编辑test:

profile = webdriver.FirefoxProfile('C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\se3w4tfi.downloadd')#****配置文件路径 browser=webdriver.Firefox(profile)#****使用配置文件路径打开浏览器 browser.get("http://master-test.simuwang.com")#****进入官网****
browser.maximize_window()

需要注意的是,如果脚本中存在有登录过程,账号密码可能已经被配置文件记住,所以会直接跳过登录过程,因此脚本中也需要删除登录代码。

Google浏览器处理方式:

from selenium import webdriver
from time import sleep
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\'} #download.default.dorectory****:设置下载路径

#profile.default content settings.popups:****设置为****0****禁止弹窗 options.add_experimental_option('prefs', prefs)#****将设置导入新打开的浏览器 driver = webdriver.Chrome(executable_path='D:\chromedriver.exe', chrome_options=options)
driver.get('http://master-test.simuwang.com')

就完事了

u 数据格式处理

在用例编写过程中,很多时候需要进行断言,一般我是使用的self.assertEqual()方法。此间涉及很多数据格式处理,因为表面相同的数据当格式不同时,也会比较成为不同。

在进行数据处理之前可以对取得数据使用print type()查看数据类型。

实例一:

在写脚本过程中我需要进行文件下载验证,但是下载路径是中文名字

---C:\用户中心\下载--- 文件名字是从页面取得的unicode类型

在脚本书写时涉及到两个部分的处理:1、因为系统只认识gbk编码的中文,所以需要将路径中的中文目录进行gbk转码,2、文件名是从页面取得,也需要转码为gbk,具体代码如下:

import os.path
file_name="****基金组合****"#****默认导出文件名称
file='D:\'+u'****用户目录****'.encode('gbk')+'\'+u'****下载****'.encode('gbk')+'\'+file_name.decode('utf-8').encode('gbk')+'.csv'#****对中文文件名进行转码 result=os.path.exists(file)
self.assertEqual(result,True,'****导出文件失败****')#****断言导出文件存在

Unicode转GBK----str.encode(‘gbk’)

Str格式转换GBK---str.decode(‘utf-8’).encode(‘gbk’)

实例二:

在写脚本过程中我经常会需要验证数据库中数据与页面表格中数据的一致性,但是数据库中数据直接用MysqlDb取得后格式是(‘data’,),无法用于数据比对,另外存在一些Decimal数据,格式为decimal(‘data’,),为处理这些数据,使之成为可以比对的整型或浮点型,有一下两个方法

方法1(主要用于取得一些字符串数据):

def Obtain_database_data(sql_string):
import MySQLdb
connect=MySQLdb.connect(host='****数据库地址****',user='username',passwd='passwd',db='databasename',charset='gbk')
cursor=connect.cursor()
cursor.execute(sql_string)#****从数据库中获取用户自定义组合名字
result=cursor.fetchall()
list=[]
for i in result:
x=i[0]
y=x.split(',')[0]
list.append(y)
return list

方法2(主要用于处理decimal类型数据):

def Get_decimal_data(sql_string):#****获得数据库中****decimal****数据类型并进行转化 import MySQLdb
connect=MySQLdb.connect(host='****数据库地址****',user='username',passwd='passwd',db='databasename',charset='gbk')
cursor=connect.cursor()
cursor.execute(sql_string)
result=cursor.fetchall()
list=[]
for i in result:
for j in i:
if len(str(j))==4:
list.append('None')#****数据库中为空时的处理
else:
m=float(str(float(j))[:-2])#****数据库中不为空时处理
list.append(m)
return list

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 学会大数据是一个要点,那么如何学习会大数据底层才是最好的 在开发基于SQL Server数据库的应用程序时,经常会...
    飞上天的猫神阅读 528评论 0 0
  • 今天来讲讲小美自己的故事 年少不知离别伤,老大方知思乡苦! 我出生在南方的小镇,爸爸是名医生,从小家里每天都会来很...
    我不是嫂子我是姑娘阅读 517评论 2 2
  • 旧历的年底毕竟最像年底,村镇上不必说,就连天空中也显出将到新年的气象来。灰白色的沉重的晚云中间时时发出闪光,接着一...
    黄雨馨阅读 375评论 1 1
  • 没想过要开简书写东西,完全出于偶然!因为老公工作压力大抱怨后,出于缓解他压力找了相关的文章来劝慰他,发现一篇文章...
    卖山茶油的骏骏妈阅读 214评论 0 0
  • 第一次认认真真地对上一周的学习生活进行了检视、反思。虽说是手写的,但感觉很真实。 时间是一个人最奇缺的...
    仕英阅读 126评论 0 1