zoukankan      html  css  js  c++  java
  • 女朋友手速太慢,导致我无精打采。

    Python+selenium自动评价器

    年年岁岁又一年,为了纪念一哈2020年的最后一天,我决定写下这篇文章。你问我为什么要纪念?因为那天我女朋友加班了...,具体什么任务呢?就是一个指标任务,需要不断的对已完成的业务进行评价。因为31号当天就要完成,所以女朋友加班到8点,ctr操作了三小时,下班后就没有精力陪我了,直接回了家,现在回过头来一想,心里仍有一丝不甘,甚是郁闷,要不是她任务太着急,也不至于我独自跨年。由此我敲下了以下代码,希望对遇见此种情况的各位朋友有所帮助。

    评价界面

    sZgvLt.png

    准备工作

    流程图

    sZ6KFe.png

    测试截图

    • 已实现功能:窗口置顶、输入编码校验、自动化点击评价、随机填入评价内容、将已输入的编码以及查询到的必要信息追加写入自动生成的excel中。
      sVpHG4.gif

    使用方法

    • 将 chromedriver.exe和自动评价器放在同一文件夹,运行自动评价器

    部分代码说明

    Python相关库

    
    import tkinter as tk #界面窗口库
    from tkinter import messagebox #弹出消息框
    #导入selenium库的webdriver以便启动浏览器驱动
    from selenium import webdriver
    #导入带参启动浏览器库
    from selenium.webdriver.chrome.options import Options 
    import time#导入time等待网页加载时间
    import xlwt#导入xlwt写入表格中的内容
    import xlrd#导入xlrd读取excel表里的单元格行数
    #导入copy模块,程序重新启动实现追加写入excel
    from xlutils.copy import copy 
    import re      #导入re用正则表达式处理数据
    import random  #随机函数库
    
    

    界面窗口参数说明

    • 值得一说:1.输入查询编码时,tkinter的button按钮可以通过布尔表达式传参,并将查询编码送往浏览器的查询输入框,如 “tk.Button(win, text='评价', width=6, command=lambda: inputText(entryInput.get())).place(x=230, y=80)";
    • 2.退出时会拦截,不会立即退出,有消息提示框,并且确认退出后会立即关闭浏览器。
    • 3.后续可能会继续完善,从已经整理好的excel中读取查询编码。
    
    #窗口
    def myWindow():
        win.title("自动评价器-仅供学习使用")
        #设置窗口大小
        win.geometry('500x130')
        #设置窗口是否可变长、宽,True:可变,False:不可变
        win.resizable(width=False, height=False)
        win.iconbitmap(r"C:/p.ico")#设置图标
        #输入窗口
        tk.Label(win, text='评价编码:').place(x=100, y=30)
        inputCode = tk.StringVar()
        entryInput = tk.Entry(win, width=35, textvariable=inputCode)
        entryInput.place(x=160, y=32)
        #评价按钮
        tk.Button(win, text='评价', width=6, command=lambda: inputText(entryInput.get())).place(x=230, y=80)
        #窗口置顶
        win.wm_attributes('-topmost',True)
        #拦截退出,做出退出提示
        win.protocol('WM_DELETE_WINDOW',closeWindow)
        win.mainloop()
    
    

    Selenium配置的浏览器说明

    • 值得一说:1.关于浏览器窗口大小设置,由于评价的页面是手机页面,所以要初始化浏览器窗口大小,网上看了很多方法都是用的 “.set_window_size(xxx,xxx) 方法,用这个方法首先会启动默认窗口大小,再设置成xxx,xxx分辨率,不太和谐,如使用options中的启动配置窗口大小则可避免该问题。
    • 2.如果不想使用者看见浏览器界面可用 “options.add_argument("--headless") “ 进行后台操作。
    
    #浏览器设置
    def browserOptions():
        # driverfile_path = r'C:chromedriver.exe'# 驱动文件路径
        options = Options()
        # options.add_argument("--headless") #设置是否可视化浏览器
        #设置浏览器窗口大小
        options.add_argument("window-size=500,900") 
        #屏蔽自动化受控提示 && 开发者提示
        options.add_experimental_option("excludeSwitches", ['enable-automation', 'load-extension'])
        #启动时加载配置
        browser = webdriver.Chrome(chrome_options=options)
        browser.get('你的评价网址')#打开浏览器预设网址
        time.sleep(1)
        return browser
    
    
    
    

    评价代码说明

    • 值得一说:1.善用Selenium定位元素标签,对于没有id属性和class属性的我大都采用的xpth进行定位,xpth不需要完全会,可以用浏览器调试工具右键复制xpth路径,自动生成。
    • 2.文本评价内容我是首先写入一个列表,再用random.choice(text) 方法进行的随机获取,当然你也可以找一本生成的评价文档,从里面获取评价内容。
    
    #评价
    def evaluate(code):
        #点击满意度评价
        for i in range(0,5):
            browser.find_elements_by_class_name("tab")[i].click()
            # js = "document.getElementsByClassName('tab')["+str(i)+"].click()"
            # browser.execute_script(js)#执行js语句
        time.sleep(0.5)
        #点击我要点赞评价
        for i in range(0,7):
            browser.find_element_by_class_name("ev_go").find_elements_by_tag_name('span')[i].click()
            # js = "document.getElementsByClassName('ev_go')[0].children["+str(i)+"].click()"
            # browser.execute_script(js)#执行js语句
        #文本评价
        text = ["工作人员态度很好,喜欢","不错,工作人员很认真","工作人员很负责","工作人员态度不错",
            "办理时间很快","环境不错,很有秩序","办理过程很愉快","给工作人员点赞","棒棒的,办理太便民了"]
        browser.find_element_by_xpath("//*[@id='evalution']/div/div/div[2]/section/div/textarea").send_keys(random.choice(text))
        time.sleep(0.5)
        #点击提交按钮
        browser.find_element_by_xpath("//*[@id='evalution']/div/div/div[5]/button").click()
        time.sleep(3)
        #获取提示信息
        promptText=browser.find_element_by_xpath("/html/body/div[4]/div[2]/div").text
        writeExcel(code,promptText)#将数据写入表格
        #点击提示框
        browser.find_element_by_xpath("/html/body/div[4]/div[3]/button").click()
    
    

    写入excel代码说明

    • 值得一说:1.我是通过try来捕获异常判断文档是否存在的,如果有异常则新建excel表,如无异常实现追加写入。
    • 2.data = xlrd.open_workbook('已录入数据.xls',formatting_info=True) 中的formatting_info=True可在复制的时候保留格式,之前没开此参数导致追加写入数据的时候出现格式不一致。
    
     #新建excel表,判断表是否存在
        try:
            data = xlrd.open_workbook('已录入数据.xls')  #打开excel
        except :
            newExcel()#不存在新建表
    
    
    #excel样式
    def excelStyle(sheet1):
        style = xlwt.XFStyle()  # 创建一个样式对象,初始化样式
        al = xlwt.Alignment()
        al.horz = 0x02      # 设置水平居中
        al.vert = 0x01      # 设置垂直居中
        style.alignment = al
        for i in range(0,5):
            sheet1.col(i).width = 255*32 #设置单元格宽度
        return style
    
    
    #新建excel
    def newExcel():
        workbook = xlwt.Workbook(encoding='utf-8')      
        sheet1 = workbook.add_sheet("数据")          #新建sheet
        style = excelStyle(sheet1)
        sheet1.write(0,0,"事项",style=style)      #第1行第1列数据
        sheet1.write(0,1,"姓名",style=style)      #第1行第2列数据
        sheet1.write(0,2,"身份证号",style=style)   #第1行第3列数据
        sheet1.write(0,3,"办件号",style=style)    #第1行第4列数据
        sheet1.write(0,4,"提示信息",style=style)    #第1行第4列数据
        workbook.save(r'已录入数据.xls')   #保存
    
    
    # 将所有录入的件存入表格,在评价方法中调用
    def writeExcel(code,promptText):
        #实现追加写入
        data = xlrd.open_workbook('已录入数据.xls',formatting_info=True)  #打开excel
        wb = copy(data)                          #利用xlutils.copy下的copy函数复制
        sheet1 = wb.get_sheet(0) #获取表单0
        nrows = data.sheets()[0].nrows #获取行数
        style=excelStyle(sheet1)
        
        #写入事项、姓名、身份证号
        for i in range(0,3):
            excelText = browser.find_elements_by_class_name("text")[i].text
            sheet1.write(nrows,i,excelText,style=style)      #第nrows行第i列数据     
        sheet1.write(nrows,3,code,style=style)    #写入办件号
        sheet1.write(nrows,4,promptText,style=style)    #写入办件号
        wb.save(r'已录入数据.xls')   #保存
    
    
    

    软件下载

  • 相关阅读:
    利用wikipedia 的API实现对其内容的查询
    Android 无标题 全屏设置
    anroid中ScrollView嵌套ListView
    ListView的不同item加载不同Layout,listviewlayout
    ListView缓存机制
    演化理解 Android 异步加载图片
    【自定义控件】自定义属性
    【自定义控件】组合控件
    【自定义控件】的基本步骤
    ContentResolver如何获取本地媒体文件
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/14250975.html
Copyright © 2011-2022 走看看