51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1406|回复: 1
打印 上一主题 下一主题

使用Selenium进行表格和导航菜单的测试

[复制链接]
  • TA的每日心情
    擦汗
    25 分钟前
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-1-20 13:26:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     对于一款web产品,页面中经常使用表格展示数据。同一个web产品,多个页面之间的表格,一般都是行列有差异,但是表格的构成元素以及样式类别都是相同的。
      1、便利操作
      这种情况下,可以定义一个表格类,使用页面表格的定位字符串进行初始化,提供一些便利操作。
      比如根据"申请号=166",找到对应的"申请时间"为"2021-12-15 08:41:14"

    实现思路为:
      根据表格定位字符串,找到表格的title行,title行的多个单元格内容组成一个列表,列表内容为:申请号、申请人、接收人、申请时间、数据流程、审批流程、文件名。
      根据表格定位字符串,找到表格的body,即数据区域,body是多行组成的一个列表。每一行又是由多个单元格组成的一个列表。所以body是一个二维列表。
      通过文本内容进行匹配,确定了“申请时间”为第4列,即目标单元在第4列。
      通过“申请号=166”,确定了目标单元在第3行。
      所以目标单元格为body[3][4]对应的页面元素。
      代码实现如下:
    1. class Table():
    2.       def __init__(self,driver,locator_type="class name",table_locator="v-table-class"):
    3.           self.table = driver.find_element(locator_type,table_locator)
    4.           self.table_title = self.table.find_element_by_class_name("v-table-title-class")
    5.           self.table_body = self.table.find_element_by_class_name("v-table-body-class")
    6.           self.table_title_cells = self.table_title.find_elements_by_tag_name("td")
    7.           self.table_body_rows = self.table_body.find_elements_by_tag_name("tr")
    8.           self.table_body_cells = []
    9.           for tr in self.table_body_rows:
    10.               self.table_body_cells.append(tr.find_elements_by_tag_name("td"))
    11.           self.table_title_cells_text = []
    12.           for td in self.table_title_cells:
    13.               self.table_title_cells_text.append(td.get_attribute("innerText"))
    14.       def filter(self,col1_title,col1_value,col2_title):
    15.           assert col1_title in self.table_title_cells_text
    16.           assert col2_title in self.table_title_cells_text
    17.           col1 = self.table_title_cells_text.index(col1_title)
    18.           col2 = self.table_title_cells_text.index(col2_title)
    19.           row = None
    20.           for j in range(len(self.table_body_cells[col1])):
    21.               if col1_value == self.table_body_cells[j][col1].get_attribute("innerText"):
    22.                   row = j
    23.           assert row != None
    24.           return self.table_body_cells[row][col2]
    复制代码
    使用举例: 查找申请号=166对应的文件名,代码如下:

    1. table_approval_records = Table(driver)
    2.   ele = table_approval_records.filter("申请号","166","文件名")
    复制代码
    找ele元素后,可以通过ele.get_attribute("innerText")获取元素文本或者执行点击操作。
      2、优化方向
      目前只支持通过一列的数据进行过滤获取一列的数据。可以扩展为通过多列数据进行过滤,返回多列的数据。
      3、导航菜单
      方式一:使用selenium点击定位元素,在各个页面间跳转。成本高。
      方式二:直接访问各个页面的地址,在各个页面间跳转。方便快捷。
    1. class Menu():
    2.       def __init__(self,driver,address="192.168.11.171"):
    3.           self.navigation = {
    4.               "zong_lan_mian_ban":"https://{address}/#/dashboard/dhdlinks/system".format(address=address),
    5.               "shen_pi_shen_qing":"https://{address}/#/approval/management".format(address=address),
    6.               "shen_pi_liu_cheng":"https://{address}/#/process/flows".format(address=address),
    7.               "shen_pi_ji_lu":"https://{address}/#/approval/history".format(address=address),
    8.               "shen_pi_she_zhi":"https://{address}/#/approval/approval_setting/email_setting".format(address=address)
    9.           }
    10.           self.driver = driver
    11.       def goto(self,submenu):
    12.           self.driver.get(self.navigation[submenu])
    复制代码




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-19 09:25 , Processed in 0.066025 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表