selenium+python脚本编写笔记(八)

本文介绍使用Selenium进行表格操作的方法,包括获取表格数据、定位单元格位置、删除表格行等技巧。同时展示了如何在测试过程中截图保存,便于调试与报告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
 
  • 显示print输出,带截图功能的html报告
测试用例中,如此使用
-----------------------------------------------------------------------------------------------------------------------------------
import unittest, time, re
from time import sleep
from Logger import * 
from selenium.webdriver.common.action_chains import ActionChains
import os,sys,time
#from datetime import *
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
#from _datetime import date
 
 
        timestr = time.strftime('%Y%m%d',time.localtime(time.time()))
        index= 2   
        img_name = timestr + '_' + str(index) + '.png'
        pic_path='E:\\Test_png\\'+img_name
        print (pic_path)
        driver.save_screenshot(pic_path)
 
--------------------------------------------------------------------------------------------------------------------------------
 

 
 
  • 关于表格的操作
http://blog.csdn.net/huayuhuan/article/details/76559465 
根据内容定位元素位置
方法一:
"""
根据table的id属性和table中的某一个元素定位其在table中的位置
table包括表头,位置坐标都是从1开始算
tableId:table的id属性
queryContent:需要确定位置的内容
"""
def get_table_content(tableId,queryContent):
    arr = []
    arr1 = []
    table_loc = (By.ID,tableId)
    # 按行查询表格的数据,取出的数据是一整行,按空格分隔每一列的数据
    table_tr_list = driver.find_element(*table_loc).find_elements(By.TAG_NAME, "tr")
    for tr in table_tr_list:
        arr1 = (tr.text).split(" ") #以空格拆分成若干个(个数与列的个数相同)一维列表
        # print(tr.text)
        # print(arr1)
        arr.append(arr1)    #将表格数据组成二维的列表
 
    #循环遍历table数据,确定查询数据的位置
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if queryContent== arr[i][j]:
                print("%r坐标为(%r,%r)" %(queryContent,i+1,j+1))
 
get_table_content("myTable","第二行第二列")
方法二:
"""
根据table的id属性和table中的某一个元素定位其在table中的位置
table包括表头,位置坐标都是从1开始算
tableId:table的id属性
queryContent:需要确定位置的内容
"""
def get_table_content(tableId,queryContent):
 
    # 按行查询表格的数据,取出的数据是一整行,按空格分隔每一列的数据
    table_tr_list = driver.find_element(By.ID, tableId).find_elements(By.TAG_NAME, "tr")
    table_list = []  #存放table数据
    for tr in table_tr_list:    #遍历每一个tr
        #将每一个tr的数据根据td查询出来,返回结果为list对象
        table_td_list = tr.find_elements(By.TAG_NAME, "td")
        row_list = []
        print(table_td_list)
        for td in table_td_list:    #遍历每一个td
            row_list.append(td.text)    #取出表格的数据,并放入行列表里
        table_list.append(row_list)
 
    # 循环遍历table数据,确定查询数据的位置
    for i in range(len(table_list)):
        for j in range(len(table_list[i])):
            if queryContent== table_list[i][j]:
                print("%r坐标为(%r,%r)" %(queryContent,i+1,j+1))
 
get_table_content("myTable","第二行第二列")
方法三
  
"""
根据CSS选择器和table中的某一个元素定位其在table中的位置
table包括表头,位置坐标都是从1开始算
cssSelector:table的CSS选择器属性
queryContent:需要确定位置的内容
"""
def get_table_content(cssSelector,queryContent):
    locator = cssSelector + ">tbody>tr"
    table_list = []
    table_tr_list = driver.find_elements(By.CSS_SELECTOR, locator)[1:] #去掉表头
    for tr in table_tr_list:
        row_list = []
        table_td_list = tr.find_elements(By.TAG_NAME,"td")
        for td in table_td_list:
            row_list.append(td.text)
        table_list.append(row_list)
 
    for i in range(len(table_list)):
        for j in range(len(table_list[i])):
            if queryContent== table_list[i][j]:
                print("%r坐标为(%r,%r)" %(queryContent,i+1,j+1))
 
get_table_content("#myTable","第二行第二列")
https://www.cnblogs.com/yan-xiang/p/6819168.html 
操作table数据

# -*- coding: utf-8 -*- from selenium import webdriver import os,time from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC

file_path = os.path.abspath('selenium_table.htm') driver = webdriver.Chrome() driver.get(file_path) table = driver.find_element_by_id('tab1')

#table的总行数,包含标题 table_rows = table.find_elements_by_tag_name('tr') print "总行数:",len(table_rows)

#tabler的总列数 ''' 在table中找到第一个tr,之后在其下找到所有的th,即是tabler的总列数 ''' table_cols = table_rows[0].find_elements_by_tag_name('th') print "总列数:",len(table_cols)

#获取某单元格的text:获取第一行第二列的text,[不算标题行] row1_col2 = table_rows[1].find_elements_by_tag_name('td')[1].text print "第一行第二列的text:",row1_col2

#删除最后一行 table_rows[-1].find_element_by_tag_name('input').click() time.sleep(2) driver.switch_to_alert().accept() time.sleep(2)

#检查是否删除成功 ''' 解释:text_to_be_present_in_element实际是一个类,由于添加了__call__方法,它的实例也可以调用 作用:检查指定元素上的文本是否符合预期

检查是否成功的思路 1.删除的是最后一行,也就是序号为'4'的那行,所以只要检查整个table中是否还有‘4’即可,如果返回false,说明删除成功,前提条件是table中的其他单元格内容均不包含‘4’ 【如果其他单元格中的内容包含‘4’,返回True,显然检查结果是不正确的,所以此处要检查的预期值必须在table中是唯一的,比如用身份证】 2.检查table中最后一行的序号是不是‘4’,如果不是,则说明删除成功 3.通过检查table的行数来判断 ''' #第一种检查 expected_4 = EC.text_to_be_present_in_element((By.XPATH,'//*[@id="tab1"]'),'4') if expected_4(driver) == False: print '第一种检查:删除成功' #time.sleep(2) #第二种检查 expected_4 = EC.text_to_be_present_in_element((By.XPATH,'//*[@id="tab1"]/tbody/tr[4]/td[1]'),'4') if expected_4(driver) != True: print '第二种检查:删除成功' #time.sleep(2) #第三种检查 table_rows_sc = table.find_elements_by_tag_name('tr') print len(table_rows_sc) if len(table_rows_sc) == len(table_rows)-1: print '第三种检查:删除成功'

获取指定单元格的内容

#table = driver.find_element_by_class_name("datagrid-btable")
        table = driver.find_element_by_xpath("html/body/div[2]/div[2]/div[2]/div[2]/div[2]/table")
        table_rows = table.find_elements_by_tag_name('tr')
        row1_col6 = table_rows[0].find_elements_by_tag_name('td')[5].text
        print ("第一行第六列的text:",row1_col6)
        #获取页面第一行数据:新代码
        row1_col7 = table_rows[0].find_elements_by_tag_name('td')[6].text
        print ("第一行第七列的text:",row1_col7)
 
 
  • 生成指定位数的随机字符串
def GenPassword(self,length):
        #随机出数字的个数
        numOfNum = random.randint(1,length-1)
        numOfLetter = length - numOfNum
        #选中numOfNum个数字
        slcNum = [random.choice(string.digits) for i in range(numOfNum)]
        #选中numOfLetter个字母
        slcLetter = [random.choice(string.ascii_letters) for i in range(numOfLetter)]
        #打乱这个组合
        slcChar = slcNum + slcLetter
        random.shuffle(slcChar)
        #生成密码
        genPwd = ''.join([i for i in slcChar])
        return genPwd 
   
调用方式
code2=self.GenPassword(7)
 
操作excel
 
xlrd-1.1.0-py2.py3-none-any.whl 读
xlwt-1.3.0-py2.py3-none-any.whl 写
 

#excel操作,低版本xlrd、xlwt、xlutils
#高版本excel,建议使用openpyxl
 
import xlrd
import xlwt
from xlutils.copy import copy
 
def test_excel(self):
        driver = self.driver
        #logger = Logger(logName1='log-group.txt',logger="supplierGroup.py").getlog() 
        #driver.get("http://")
        #os.system("D:\\login2.exe")
        #sleep(3)
        self.new_excel()
        self.read_excel()
        list1=self.excel_table_byindex(r'D:\demo1.xlsx',0,0)
        list2=self.excel_table_byname(r'D:\demo1.xlsx',0,u'表2')
        print(list1)
        print(list2)
       
        #新建excel并设置格式,写入数据
        styleBoldRed   = xlwt.easyxf('font: color-index red, bold on')
        headerStyle = styleBoldRed
        wb = xlwt.Workbook()
        ws = wb.add_sheet('表3')
        ws.write(0, 0, "Header",        headerStyle)
        ws.write(0, 1, "CatalogNumber", headerStyle)
        ws.write(0, 2, "PartNumber",    headerStyle)
        wb.save(r'D:\demo5.xls')
 
        #open existed xls file
        #newWb = xlutils.copy(gConst['xls']['fileName'])
        #newWb = copy(gConst['xls']['fileName'])
       
        #打开已存在excel并写入数据----方式一
        oldWb = xlrd.open_workbook(r'D:\demo5.xls', formatting_info=True)
        print (oldWb)  #<xlrd.book.Book object at 0x000000000315C940>
        newWb = copy(oldWb)
        print (newWb)  #<xlwt.Workbook.Workbook object at 0x000000000315F470>
        newWs = newWb.get_sheet(0)
        newWs.write(1, 0, "value1")
        newWs.write(1, 1, "value2")
        newWs.write(1, 2, "value3")
        print ("write new values ok")
        newWb.save(r'D:\demo6.xls')
        print ("save with same name ok")
   
        #打开已存在数据并写入数据---方式二
        #如果excel格式是xlsx,则formatting_info=True会报错NotImplementedError: formatting_info=True not yet implemented
        oldWb = xlrd.open_workbook(r'D:\demo1.xls', formatting_info=True)
        print (oldWb) #<xlrd.book.Book object at 0x000000000315C940>
        newWb = copy(oldWb)
        print (newWb) #<xlwt.Workbook.Workbook object at 0x000000000315F470>
        newWs = newWb.get_sheet(0);
        # newWs.write(1, 0, "value1");
        # newWs.write(1, 1, "value2");
        # newWs.write(1, 2, "value3");
        table = oldWb.sheets()[0]
        nrows = table.nrows
        ncols = table.ncols
        for rownum in range(1,nrows):
            row = table.row_values(rownum)
            if row:
               app={}
               for i in range(1,ncols+1):
                   app[i] = row[i-1]
               newWs.write(rownum,6,"sdf?sdf="+app[1]+"&sdf="+app[2]+"&sdfsdf="+app[3])
        print (nrows)
        print (ncols)
        print ("write new values ok")
        newWb.save(r'D:\demo3.xls')
        print ("save with same name ok")
   
        w=copy(r'D:\demo3.xls') 
        w.get_sheet(0).write(0,0,"foo") 
        w.save(r'D:\demo4.xls') 
   
       
              
    def read_excel(self):
       
 
        # 打开文件
        workbook = xlrd.open_workbook(r'D:\demo1.xlsx')
        # 获取所有sheet
        print (workbook.sheet_names()) # [u'sheet1', u'sheet2']
        sheet2_name = workbook.sheet_names()[1]
        # 根据sheet索引或者名称获取sheet内容
        sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始
        sheet2 = workbook.sheet_by_name('表2')
        # sheet的名称,行数,列数
        print (sheet2.name,sheet2.nrows,sheet2.ncols)
 
        # 获取整行和整列的值(数组)
        rows = sheet2.row_values(3) # 获取第四行内容
        cols = sheet2.col_values(2) # 获取第三列内容
        print (rows)
        print (cols)
        # 获取单元格内容
        print (sheet2.cell(1,0).value.encode('utf-8'))
        print (sheet2.cell_value(1,0).encode('utf-8'))
        print (sheet2.row(1)[0].value.encode('utf-8'))
  
        # 获取单元格内容的数据类型
        print (sheet2.cell(1,0).ctype)
       
        #sheet表.put_cell(row, col, ctype, value, xf)
        # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
        #xf 扩展的格式化
        sheet2.put_cell(1,1,1,"字符串",0) #这句代码不好使
        
    def new_excel(self):
         
        #新建一个excel文件 
        file = xlwt.Workbook() 
        #新建一个sheet 
        table = file.add_sheet('info',cell_overwrite_ok=True) 
        #写入数据table.write(行,列,value) 
        table.write(0,0,'wangpeng') 
        #保存文件,保存成xls格式,xlsx会提示打不开格式错误
        file.save(r'D:\demo.xls') 
   
       
    def open_excel(self,file= 'file.xls'):
        try:
           data = xlrd.open_workbook(file)
           return data
        except Exception as e:
           print (str(e))
       
    #输出excel表格内容
    #根据索引获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_index:表的索引
    def excel_table_byindex(self,file= 'file.xls',colnameindex=0,by_index=0):
        data = self.open_excel(file)
        table = data.sheets()[by_index]
        nrows = table.nrows #行数
        ncols = table.ncols #列数
        colnames =  table.row_values(colnameindex) #某一行数据
        list =[]
        for rownum in range(1,nrows):
 
            row = table.row_values(rownum)
            if row:
               app = {}
               for i in range(len(colnames)):
                   app[colnames[i]] = row[i]
               list.append(app)
        return list
 
    #根据名称获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_name:Sheet1名称
    def excel_table_byname(self,file= 'file.xls',colnameindex=0,by_name=u'Sheet1'):
        data = self.open_excel(file)
        table = data.sheet_by_name(by_name)
        nrows = table.nrows #行数
        colnames =  table.row_values(colnameindex) #某一行数据
        list =[]
        for rownum in range(1,nrows):
            row = table.row_values(rownum)
            if row:
               app = {}
               for i in range(len(colnames)):
                   app[colnames[i]] = row[i]
               list.append(app)
        return list
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值