【Python Selenium】简单数据生成脚本

"""
selenium驱动Firefox实现人工操作进行数据生成,输出日志到文本文件
"""
from basePageUtil import *
from selenium import webdriver
from selenium.webdriver.common.by import By
import xlrd
import re
import time
from datetime import datetime,timedelta
from selenium.webdriver.common.keys import Keys

#读取Excel表格数据
def excle_table(file,table,colnameindex,file_log,fb,by_index=0):
    # 某一行数据
    colvalues = table.row_values(colnameindex)
    #定义一个空列表,用来存放Excel的每行数据
    # list = []
    #表头数据
    row = table.row_values(0)
    if row:
        list = {}
        for i in range(len(colvalues)):
            if i ==10:
                try:
                    #格式化Excel表日期
                    excel_date = xlrd.xldate.xldate_as_datetime(colvalues[i], 0)
                    #日期格式化为str类型
                    dt = datetime.strptime(str(excel_date), "%Y-%m-%d %H:%M:%S").strftime('%Y-%m-%d')
                    #将日期数据传入到相应的表头下
                    list[row[i]] = dt
                except Exception:
                    # e_bd = '第{0}条数据,初登日期格式错误'.format(colnameindex) + 'n'
                    # fb.write(e_bd)
                    continue
            elif i == 11 or i ==12:
                try:
                    # 格式化Excel表日期
                    excel_date = xlrd.xldate.xldate_as_datetime(colvalues[i], 0)
                    # 日期格式化为datetime类型
                    dt = datetime.strptime(str(excel_date), "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d %H:%M")
                    # 将日期数据传入到相应的表头下
                    list[row[i]] = dt
                except Exception:
                    # e_edate = '第{0}条数据,起保日期、终保日期格式错误'.format(colnameindex) + 'n'
                    # fb.write(e_edate)
                    continue
            else:
                list[row[i]] = colvalues[i]
    return list
def flag(year):
    if year % 400 == 0 or (year % 100 != 0 and year % 4 == 0):
        return True
    else:
        return False

def login():
    driver = webdriver.Firefox()
    url = 'http://172.20.xx.xx/xxxx/login.do'
    driver.get(url)
    driver.maximize_window()
    UserName = "username"
    PassWord = "password"

    RawData = basePage(driver, url)
    # 登录
    RawData.find_element((By.ID, 'j_username')).send_keys(UserName)
    RawData.find_element((By.ID, 'j_password')).send_keys(PassWord)
    RawData.find_element((By.ID, 'login_ok')).click()
    # 点击数据生成
    RawData.find_element((By.LINK_TEXT, '数据生成')).click()

    # 点击商业险数据生成
    RawData.find_element((By.ID, 'main_treeDemo_34_9_span')).click()
    #数据文件路径
    file = r"C:UserszgDesktopdata.xlsx"
    # 打开excle文件
    data = xlrd.open_workbook(file)
    # 读取第一个sheet页
    table = data.sheet_by_index(0)
    # 行数
    nrows = table.nrows
    #错误日志文件
    file_out = r'C:UserszgDesktoplog.txt'
    DateNow = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    fb = open(file_out,'a')
    fb.write(DateNow + 'n')
    # 数据条数
    succ_num = 0
    fail_num = 0
    NUM = nrows
    for data_index in range(1,NUM):

        listdata = excle_table(file,table,data_index,file_out,fb)
        if (len(listdata) <= 0):
            assert 0, u'Excle数据异常'
        try:
            #省份选择
            RawData.find_element((By.XPATH,'//a[@lookupgroup='cityLookup']/i')).click()
            # RawData.find_element((By.LINK_TEXT, '河北')).click()
            province = listdata['省份']
            time.sleep(0.5)
            #js设置搜索框大小
            scri1 = "var doc = document.getElementById('city');doc.style.height='685px';"
            scri2 = "var doc = document.getElementsByTagName('div');" 
                    "for(var i=0;i < doc.length;i++){" 
                    " if (doc[i].className == 'dialog dialog-box'){" 
                    "doc[i].style.top='20px';}}"
            scri3 = "var doc = document.getElementsByTagName('div');" 
                    "for(var i=0;i < doc.length;i++){" 
                    " if (doc[i].className == 'dialogContent layoutBox unitBox'){" 
                    "doc[i].style.height='690px';}}"
            #执行js脚本
            driver.execute_script(scri1)
            driver.execute_script(scri2)
            driver.execute_script(scri3)
            try:
                RawData.find_element((By.LINK_TEXT,province)).click()
            except:
                e_pro = '第{0}条数据省份有误,'.format(data_index)
                fb.write(e_pro)
                raise

            #公司名称
            RawData.find_element((By.XPATH,'//a[@id='companySelect']/i')).click()
            #获取公司名称
            company = re.search('[^a-zA-Zs]+', listdata['需要生成哪家公司的数据']).group()
            try:
                # 输入公司名称
                RawData.find_element((By.ID, 'compname')).send_keys(company)
                #点击检索
                RawData.find_element((By.XPATH, "//button[text()='检索']")).click()
                #点击选择
                RawData.find_element((By.LINK_TEXT, '选择')).click()
            except:
                RawData.find_element((By.XPATH, '/html/body/div[12]/div[1]/div/div/a[1]/i')).click()
                e_ComCode = '第{0}条数据公司名称有误,'.format(data_index)
                fb.write(e_ComCode)
                raise
            try:
                #数据库选择
                RawData.find_element((By.XPATH,"//button[@data-id='commerAreaVsUrl']")).click()
                loc_db = "/html/body/div/div/ul/li/a/span[text()='{0} 联调']".format(province)
                RawData.find_element((By.XPATH, loc_db)).click()
            except:
                e_db = '第{0}条数据数据库名称有误,'.format(data_index)
                fb.write(e_db)
                raise

            try:
                #业务种类选择
                RawData.find_element((By.XPATH,"//button[@data-id='biz_bjautotypes']")).click()
                YWZL = listdata['业务种类']
                RawData.find_element((By.XPATH, "/html/body/div[13]/div/ul/li/a/span[text()='" + YWZL + "']")).click()
            except:
                e_YWZL = '第{0}条数据业务种类有误,'.format(data_index)
                fb.write(e_YWZL)
                raise
            # 日期
            # 起保日期
            eds = driver.find_elements_by_xpath("//input[@name='effectiveDate']")
            # 终保日期
            exds = driver.find_elements_by_xpath("//input[@name='expireDate']")
            # 签单日期
            bds = driver.find_elements_by_xpath("//input[@name='billDate']")
            # 投保查询日期
            qds = driver.find_elements_by_xpath("//input[@name='queryDate']")
            # 起保日期
            effdt_data = listdata['起保日期']
            # 终保日期
            exdt_data = listdata['终保日期']
            # 起保日期格式化
            effdt_data_tra = datetime.strptime(effdt_data, "%Y-%m-%d %H:%M")
            # 终保日期格式化
            exdt_data_tra = datetime.strptime(exdt_data, "%Y-%m-%d %H:%M")
            #业务种类列表
            YWZL1 = ['连续5年没有发生赔款','连续4年没有发生赔款','连续3年没有发生赔款','连续2年没有发生赔款','连续1年没有发生赔款']
            years = re.search('d', YWZL).group()
            #对业务种类进行判断
            if YWZL in YWZL1:

                if flag(effdt_data_tra.year) == True and effdt_data_tra.month == 2 and effdt_data_tra.day == 29:
                    flagYear = True
                else:
                    flagYear = False
                for i in range(0, int(years)):
                    # 传入日期前数据清空
                    eds[i].clear()
                    exds[i].clear()
                    bds[i].clear()
                    qds[i].clear()
                    # 起保日期年份
                    effdt_year = effdt_data_tra.year
                    #起保日期减一天
                    effdt_now = effdt_data_tra - timedelta(days=1)
                    # 传入起保日期
                    eds[i].send_keys(str(effdt_data_tra.strftime("%Y-%m-%d %H:%M")))
                    # 传入终保日期
                    exds[i].send_keys(str(exdt_data_tra.strftime("%Y-%m-%d %H:%M")))
                    # 传入签单日期
                    bds[i].send_keys(effdt_now.strftime("%Y-%m-%d"))
                    # 传入投保查询日期
                    qds[i].send_keys(effdt_now.strftime("%Y-%m-%d"))
                    # 终保日期
                    exdt_data_tra = effdt_data_tra
                    if flagYear == True:
                        if flag(effdt_year - 1) == True:
                            effdt_data_tra_str = "{0}-02-29 00:00".format(effdt_year - 1)
                        if flag(effdt_year - 1) == False:
                            effdt_data_tra_str = "{0}-02-28 00:00".format(effdt_year - 1)
                        effdt_data_tra = datetime.strptime(effdt_data_tra_str, "%Y-%m-%d %H:%M")
                    else:
                        if flag(effdt_year) == True and (
                                effdt_data_tra.month > 2 or effdt_data_tra.month == 2 and effdt_data_tra.day == 29):
                            # 起保日期减366天
                            effdt_data_tra = effdt_data_tra - timedelta(days=366)
                        elif flag(effdt_year) == False and flag(effdt_year - 1) == True and effdt_data_tra.month < 3:
                            # 起保日期减366天
                            effdt_data_tra = effdt_data_tra - timedelta(days=366)
                        else:
                            # 起保日期减365天
                            effdt_data_tra = effdt_data_tra - timedelta(days=365)
            else:
                # 结案时间
                CTs = RawData.find_elements((By.XPATH, "//input[@name='ClaimCloseTime']"))

                for i in range(0,int(years)):
                    #传入日期前数据清空
                    eds[0].clear()
                    exds[0].clear()
                    bds[0].clear()
                    qds[0].clear()
                    CTs[i].clear()
                    # 起保日期年份
                    effdt_year = effdt_data_tra.year
                    # 起保日期减一天
                    effdt_now = effdt_data_tra - timedelta(days=1)
                    # 起保日期加一天,结案时间
                    CT_now = effdt_data_tra + timedelta(days=i+1)
                    # 传入起保日期
                    eds[0].send_keys(str(effdt_data_tra))
                    # 传入终保日期
                    exds[0].send_keys(str(exdt_data_tra))
                    # 传入签单日期
                    bds[0].send_keys(effdt_now.strftime("%Y-%m-%d"))
                    # 传入投保查询日期
                    qds[0].send_keys(effdt_now.strftime("%Y-%m-%d"))
                    # 传入结案时间
                    CTs[i].send_keys(CT_now.strftime("%Y-%m-%d %H:%M"))
            #向上翻页
            RawData.find_element((By.ID, 'bjautolayout_table_css')).send_keys(Keys.PAGE_UP)
            try:
                #号牌选择
                RawData.find_element((By.XPATH,"//button[@data-id='autolicenseType']")).click()
                license = listdata['号牌种类'].strip()
                RawData.find_element((By.XPATH, "/html/body/div[14]/div/ul/li/a/span[text()='"+license+"']")).click()
            except:
                e_license = '第{0}条数据号牌种类有误,'.format(data_index)
                fb.write(e_license)
                raise

            try:
                #车辆类型
                RawData.find_element((By.XPATH,"//button[@data-id='car_type']")).click()
                CLLX = listdata['车辆种类']
                RawData.find_element((By.XPATH, "/html/body/div[15]/div/ul/li/a/span[text()='"+ CLLX +"']")).click()
            except:
                e_CLLX = '第{0}条数据车辆类型有误,'.format(data_index)
                fb.write(e_CLLX)
                raise

            try:
                #使用性质
                RawData.find_element((By.XPATH,"//button[@data-id='car_type2s']")).click()
                SYXZ = listdata['使用性质'].strip()
                RawData.find_element((By.XPATH, "/html/body/div[16]/div/ul/li/a/span[text()='"+ SYXZ +"']")).click()
            except:
                e_SYXZ = '第{0}条数据使用性质有误,'.format(data_index)
                fb.write(e_SYXZ)
                raise

            #车主姓名
            # RawData.find_element((By.ID,"roleName")).send_keys('张三')

            #保额
            # RawData.find_element((By.ID,"sumLimit")).send_keys('1000')

            try:
                #车三项
                RawData.find_element((By.XPATH,"//button[@data-id='iscarform']")).click()
                RawData.find_element((By.XPATH,"/html/body/div[17]/div/ul/li/a/span[text()='否']")).click()
            except:
                e_CSX = '第{0}条数据车三项选择有误,'.format(data_index)
                fb.write(e_CSX)
                raise

            try:
                #初登日期
                Registerdate = str(listdata['初登日期'])
                RawData.find_element((By.ID, "registerdate")).send_keys(Registerdate)
            except:
                e_registerdate = '第{0}条数据初登日期有误,'.format(data_index)
                fb.write(e_registerdate)
                raise

            try:
                #是否过户车
                RawData.find_element((By.XPATH,"//button[@data-id='transferid']")).click()
                GHC = listdata['是否过户车'].strip()
                RawData.find_element((By.XPATH,"/html/body/div[18]/div/ul/li/a/span[text()='"+GHC+"']")).click()
            except:
                e_GHC = '第{0}条数据过户车选择有误,'.format(data_index)
                fb.write(e_GHC)
                raise

            try:
                #数据条数
                DataNum = str(int(listdata['数据条数']))
                # DataNum = re.search('d+',listdata['数据条数']).group()
                RawData.find_element((By.ID, "commertshu")).send_keys(DataNum)
            except:
                e_DataNum = '第{0}条数据数据条数有误,'.format(data_index)
                fb.write(e_DataNum)
                raise

            try:
                #是否是异地车
                RawData.find_element((By.XPATH,"/html/body/div[1]/div[3]/div/div[2]/div[2]/div[2]/form/div[1]/table/tbody/tr[39]/td[2]/div/button")).click()
                YDC = listdata['是否异地车'].strip()
                RawData.find_element((By.XPATH,"/html/body/div[19]/div/ul/li/a/span[text()='"+YDC+"']")).click()
            except:
                e_YDC = '第{0}条数据异地车选择有误,'.format(data_index)
                fb.write(e_YDC)
                raise

            # 保单系数算法
            RawData.find_element((By.XPATH,"//button[@data-id='case_type2']")).click()
            RawData.find_element((By.XPATH,"/html/body/div[20]/div/ul/li/a/span[text()='新']")).click()

            # 多年车贷
            RawData.find_element((By.XPATH,"/html/body/div[1]/div[3]/div/div[2]/div[2]/div[2]/form/div[1]/table/tbody/tr[40]/td[4]/div/button")).click()
            RawData.find_element((By.XPATH,"/html/body/div[21]/div/ul/li/a/span[text()='否']")).click()


            try:
                #提交公司代码
                RawData.find_element((By.XPATH,"/html/body/div[1]/div[3]/div/div[2]/div[2]/div[2]/form/div[1]/table/tbody/tr[41]/td[2]/div/button")).click()
                ComCode = listdata['本公司名称'].replace(' ','-').strip()
                RawData.find_element((By.XPATH, "/html/body/div[22]/div/ul/li/a/span[text()='"+ ComCode +"']")).click()
            except:
                e_ComCode = '第{0}条数据公司代码有误,'.format(data_index)
                fb.write(e_ComCode)
                raise
            #点击提交
            RawData.find_element((By.XPATH,"//button[text()='提交']")).click()
            # time.sleep(3)
            RawData.find_element((By.XPATH,"//button[text()='确定']")).click()
            #刷新商业数据生成页面
            RawData.find_element((By.ID, 'main_treeDemo_34_9_span')).click()
            # 成功条数d
            succ_num += 1
            time.sleep(0.5)
            e_succ = '第{0}条数据生成成功'.format(data_index) + 'n'
            fb.write(e_succ)
        except:
            e_fail = '数据生成失败,请校验数据。n’
            fb.write(e_fail)
            # 刷新商业数据生成页面
            RawData.find_element((By.ID, 'main_treeDemo_34_9_span')).click()
            fail_num +=1
            time.sleep(0.5)
    fb.write('n本次数据条数共{0}条,成功{1}条,失败{2}条。n'.format(NUM - 1, succ_num, fail_num))
    fb.close()
if __name__== '__main__':
    login()

行和缩进

Python语言中行和缩进是非常严格的,学习Python与其他语言最大的区别就是,Python的代码块不使用大括号({})来控制类,函数以及其他逻辑判断。python最具特色的就是用缩进来写模块。

缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量。

 

图片 1

图片 2

 

在写代码的时候,往往会不经意间多加一个空格或者Tab一下:

 

图片 3

 

那么我们在这个错误运行的时候会弹出

 

图片 4

 

这个错误就是提示你,老兄你写的代码有个格式上的错误,我们就能看到if前,就多了一个小小的空格,在写代码的时候我们会很难看到的,现在是代码少的阶段。如果给你几百行的时候,这样的不注意,会导致你无法进行下去。

 图片 5

 

所以我们在开始学习Python过程中,要时刻注意代码的行和缩进

 

  代码比较简单,不喜勿喷,本人正在学习阶段!

人生苦短,我学Pyhton

图片 6

  Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

 

和Python第2节中讲到了Python的正式安装和操作步骤,接下来就是进入代码的世界了!!

 

Window上在安装Python时已经已经安装了默认的交互式编程客户端,提示窗口如下:

图片 7

 

在Python中能记性计算机语言通用的计算效果,和简单的输出语言,比如我们在python提示符中输入‘Hello World’内容,按Eter看一下效果!

图片 8

  

这里一位大神重写了元素定位、send_keys等方法,咱们直接进行调用。

Python的注释

 Python中需要很多的注释,这样你在写项目的时候,插入函数方法的时候可以轻易的找到你该插入的位置,那么注释用什么符号来注释呢?那就是#符号!

 

图片 9

 在你的项目代码中注释的内容不会出现在结果中的!

 

  Python学习交流QQ群:25452556,欢迎大家加入(群主就是重写代码那位)!

 

废话不多说,直接上代码!!

Python的等待用户输入

在Python中等待用户的输入函数raw_input

 

图片 10

图片 11

 

 

(今天所说的就是Python对编辑器的初识,那么在你见到的Python的编译器是不是感觉代码的量很少呢!还有它就像强盗一样,其它的有名的语言也能调用库来用哦1)

本文由金沙官网线上发布于编程,转载请注明出处:【Python Selenium】简单数据生成脚本

您可能还会对下面的文章感兴趣: