对NENU研究生教务系统网站做自动化测试

       由上一篇博客可知(解决NENU研究生教务系统网站“不能创建对象”等兼容性问题-CSDN博客),我通过Tampermonkey脚本解决了NENU研究生教务系统网站在非IE内核浏览器中访问时“不能创建对象”的问题。

        在解决问题的过程中,为了Tampermonkey脚本的使用不影响研究生教务系统网站的功能使用,需要通过回归测试保证研究生教务系统网站的功能没有受影响。

        在总结了研究生教务系统的所有功能后,在杨贵福老师的建议下使用自动化测试工具Selenium对教务系统做了自动化测试。

        由于NENU研究生教务系统网站有较大变化,对网站总结的功能表格也随着改变。下表为现在NENU研究生教务系统网站的功能总结,也许以后还会有变化。

页面

子页面

功能

是否完成自动化测试

“培养方案”页面

“培养方案总纲”页面

进入“教学执行计划”页面

是

选择专业

是

选择年级

是

点击按钮

是

点击按钮

是

“教学周历管理”页面

“教学周历查询”页面

点击“学年学期”下拉框

是

选择学年学期

打印功能

是

“学生选课”页面

“学期课表查询”页面

选择“周次”

是

选择“学期”

是

点击按钮

是

选择复选框

是

点击

是

点击“打印课表(非合并)”

是

点击“打印课表(合并)”

是

     “成绩信息”页面

“成绩查询”页面

“学号”、“像”等一系列下拉框

是

文本框输入“学号”和“姓名”

是

点击按钮

是

“提出质疑”功能

是

“打印申请表”功能

是

切换页数按钮

是

切换页数文本框

是

切换页数按钮

是

点击“打印”按钮

是

选择打印条件

是

点击“确定”按钮

是

点击“取消”按钮

是

点击“切换”按钮

是

页面操作按钮

关闭页面

是

最小化页面

是

最大化页面

是

        在对教务系统网站做自动化回归测试时,学习到很多新的测试技术。

        大多数功能的测试使用Seleium提供的元素定位的方法(findElement()方法)、点击元素的方法(click())、在文本框中填入内容的方法(sendkeys())都可以实现,着重说一下比较难实现的点,也就是我在本次自动化测试中学习到的新的测试技术和遇到的测试难题。

1.Frame切换

1.1问题描述

        在定位图1所示页面中的左侧导航栏中的“培养方案总纲”选项时,总报定位不到元素的错误,如下图所示。

图1

1.2 解决过程        

        最初的工作重点放在检查代码上,反复检查代码并未发现任何问题。

        在网络上搜索,偶然发现有人在一篇博客中提到了切换iframe的问题,若iframe没有切换正确,那么元素无法被定位到。(博客链接为python 关于selenium模拟一页一页点击,出现定位错误的解决_no such element: unable to locate element: {"metho-CSDN博客)

        于是检查图1所示的源代码,在源代码中搜索“iframe”,发现包括“培养方案总纲”和“教学执行计划”的菜单确实在iframe标签下。如下图所示。

        通过参考官方文档(链接为Working with IFrames and frames | Selenium),明白了Selenium只能访问顶级document中的元素,若要与iframe或frame中的元素交互,需要切换到元素所在的iframe或frame下,类似于切换窗口的方式。

        WebDriver提供了3种切换iframe或frame的方式,分别是

  1. 使用WebElement
  2. 使用name或id
  3. 使用索引

        在测试代码中通过采用索引的方式切换到iframe中

driver.switchTo().frame(0);

        元素依然不能被成功定位到。

        检查网页代码后发现iframe标签中嵌套了frameset标签和frame标签,frameset标签不用使用switchTo()切换frame,而frame标签需要逐层切换。

        于是将代码修改为

driver.switchTo().frame(0);driver.switchTo().frame(0);

问题解决,可以成功通过selenium点击“培养方案总纲”和“教学执行计划”。

1.3结论

1.页面中有iframe标签或frame标签时,需要使用switchTo()方法切换到要定位元素的frame或iframe标签下,才可以定位到所要定位的元素。 

2.frameset标签不用使用switchTo()切换frame,而frame标签需要逐层切换。

 

2.窗口切换

todo

3.实现鼠标双击

todo

4.通过实例化Select类的对象选择下拉框的选项

todo

6.线程等待的重要性

todo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/736150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外卖平台订餐流程架构的实践

当我们想要在外卖平台上订餐时,背后其实涉及到复杂的技术架构和流程设计。本文将就外卖平台订餐流程的架构进行介绍,并探讨其中涉及的关键技术和流程。 ## 第一步:用户端体验 用户通过手机应用或网页访问外卖平台,浏览菜单、选择…

010Editor汉化版+下载+注册码+模板bug

项目场景: 这天我想使用我的不知名的一个破解版本的010Edit来查看一个EXE程序,并想使用模板功能,但是发现没有该模板还无法下载最新模板 问题描述 010Edit联网后需要注册码: 010 Editor 激活码生成器 使用方法 参照教程使用0…

GitHub Desktop的常用操作【图形化】

文章目录 【1】仓库的创建和删除【2】文件操作【3】分支原理与分支操作1.分支创建2.分支合并 【4】标签 【1】仓库的创建和删除 在本地创建一个新的仓库: 然后输入仓库的名称,描述,并选择路径: 点击完后就发现我们的仓库创建好…

MYSQL--JSON_OBJECT 和 JSON_ARRAYAGG

JSON_OBJECT 和 JSON_ARRAYAGG 是 MySQL 中用于处理 JSON 数据类型的函数。这两个函数可以帮助你更轻松地构建和操作 JSON 数据。 JSON_OBJECT JSON_OBJECT 函数用于生成一个 JSON 对象。你可以为这个函数提供一系列键值对,它会返回一个包含这些键值对的 JSON 对象…

Jetty的http3模块

启用http3模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-moduleshttp3命令的输出,如下: ALERT: There are enabled module(s) with licenses. The following 2 module(s): contains software not provided by the …

RocketMQ存储设计深度解析

引言 在分布式系统中,消息中间件扮演着至关重要的角色,它负责系统间异步消息的传递,确保信息可靠传输。Apache RocketMQ(以下简称RocketMQ)是这一领域中的一个优秀代表。RocketMQ以其高性能、高可靠性和高扩展性赢得了…

图片表格特征不明显怎么转成结构化excel?如何定制最划算?

金鸣定制识别是一种基于OCR(光学字符识别)技术的先进解决方案,旨在为用户提供高效、准确的数据抽取和识别服务。该服务允许用户根据自身的需求,提交样本图片,利用金鸣识别现有的OCR模型进行训练,从而有效降…

Android studioSDK集成:com.yechaoa.yutilskt

文章目录 1、工具介绍2、集成 1、工具介绍 com.yechaoa.yutilskt是一个Android开发工具库,提供了一些常用的工具类和方法,方便开发者进行Android应用程序的开发。该库包含了以下功能: 网络请求工具类:提供了简化的网络请求方法&…

【Flutter 面试题】dart是值传递还是引用传递?

【Flutter 面试题】dart是值传递还是引用传递? 文章目录 写在前面解答补充说明值传递示例引用传递示例总结 写在前面 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主…

【py】加载sdk文件夹中的dll

使用ctypes库即可 import ctypes import osdef load_sdk_dlls(folder_path):for file_name in os.listdir(folder_path):if file_name.endswith(".dll"): # 确保只加载 DLL 文件dll_path os.path.join(folder_path, file_name)try:dll ctypes.CDLL(dll_path)# pr…

【蓝桥杯】k倍区间

一.题目描述 二.问题分析 对于该问题,标签上写的是暴力,但是如果使用暴力的话,会超时。 首先,对于两个数a,b(假设a小于b),若a与b对k取余后结果相同,则b-a可以整除k。 …

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

开发指南001-开发环境的搭建

开发环境有两种模式&#xff1a;分布式和直连式&#xff0c;以是否使用nacos和网关为标志。分布式要使用nacos和网关&#xff0c;通常是搭建个服务器&#xff0c;把相关环境部署上去&#xff0c;当然也可以不使用服务器&#xff0c;直接在开发人员自己的机器上部署环境。直连式…

c++ condition_variable使用场景

std::condition_variable的步骤如下: 1.创建一个 std::condition_variable 对象。 2.创建一个互斥锁std::mutex对象&#xff0c;用来保护共享资源的访问。 3.在需要等待条件变量的地方使用std::unique_lock<std::mutex>对象锁定互斥锁,并调用s…

strlen和sizeof的应用与区别

sizeof和strlen作为都能求大小的工具两者之间有何不同, strlen: 1. strlrn计算的是什么的大小 strlen计算的是字符串长度的大小&#xff0c;所以strlen在计算字符串长度时会一直顺着字符串的元素一个一个的查找&#xff0c;一直到查询到了/0才会停止 2.strlen属于库函数&am…

easyexcel文件上传

easyexcel文件上传 前言&#xff1a;功能开发中&#xff0c;难免碰到数据上传下载功能&#xff0c;excel上传常见用于报表上传&#xff0c;绩效上传&#xff0c;考勤上传… 使用步骤&#xff1a; 1&#xff0c;编写业务层&#xff1a; 1&#xff0c;添加easyexcel依赖 <…

[Java安全入门]三.URLDNS链

一.前言 在初步学习java的序列化和反序列化之后&#xff0c;这里学习java反序列化漏洞的一个利用链&#xff0c;也是比较基础的一条链。 由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检测反序列化的点。 二.代码展开分析 构造链 …

Spring AOP 原理

&#x1f496; AOP 介绍 AOP&#xff0c;也就是 Aspect-oriented Programming&#xff0c;译为面向切面编程。 简单点说&#xff0c;就是把一些业务逻辑中的相同代码抽取到一个独立的模块中&#xff0c;让业务逻辑更加清爽。 举个例子&#xff0c;假如我们现在需要在业务代码…

Error while Deploying HAP

第一个程序就遇到这么恶心的bug&#xff0c;也查了很多类似的问题是什么情况&#xff0c;后来无意中菜解决了这个bug&#xff0c;确实也是devicps下面加一个参数&#xff0c;但是找了半天 这是我遇到这个问题的解决办法。其他解决办法如下&#xff1a; https://blog.51cto.com…

Leetcode 第 387 场周赛题解

Leetcode 第 387 场周赛题解 Leetcode 第 387 场周赛题解题目1&#xff1a;3069. 将元素分配到两个数组中 I思路代码复杂度分析 题目2&#xff1a;3070. 元素和小于等于 k 的子矩阵的数目思路代码复杂度分析 题目3&#xff1a;3071. 在矩阵上写出字母 Y 所需的最少操作次数思路…