Selenium实践总结
1.使用显示等待而不是隐式等待
隐式等待可能会导致不可预测的测试行为,尤其是在动态 Web 应用程序中。显式等待,它允许您
等待特定条件发生后再继续测试,这种方法提供了更多的控制和可靠性。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("elementId")));
2.使用页面对象模型(POM)
页面对象模型是一种设计模式,可增强测试维护并减少代码重复。它涉及为每个网页或组件创建一
个类,封装页面的元素和行为。
public class LoginPage
{private IWebDriver driver;private By usernameField = By.Id("username");private By passwordField = By.Id("password");private By loginButton = By.Id("login");public LoginPage(IWebDriver driver){this.driver = driver;}public void EnterUsername(string username){driver.FindElement(usernameField).SendKeys(username);}public void EnterPassword(string password){driver.FindElement(passwordField).SendKeys(password);}public void ClickLogin(){driver.FindElement(loginButton).Click();}
}
3.优先使用CSS选择器而不是XPath
CSS 选择器通常比 XPath 更快、更易读。使用 CSS 选择器可获得更好的性能和更简洁的代码。
// CSS Selector
driver.FindElement(By.CssSelector(".class-name"));
// XPath
driver.FindElement(By.XPath("//div[@class='class-name']"));
4.避免硬编码测试数据
硬编码测试数据会让你的测试变得难以维护。使用数据驱动的测试技术将测试数据与
测试逻辑分开。
[TestCase("user1", "pass1")]
[TestCase("user2", "pass2")]
public void TestLogin(string username, string password)
{var loginPage = new LoginPage(driver);loginPage.EnterUsername(username);loginPage.EnterPassword(password);loginPage.ClickLogin();
}
5.实现强大的异常处理
try
{// Test logic here
}
catch (NoSuchElementException ex)
{Console.WriteLine("Element not found: " + ex.Message);
}
catch (Exception ex)
{Console.WriteLine("An error occurred: " + ex.Message);
}
自动化测试中不可避免地会出现异常。实施强大的异常处理,以确保测试正常失败并提供
有意义的错误消息。
6.利用浏览器特定选项
不同的浏览器可能有不同的行为。利用特定于浏览器的选项来自定义浏览器的行为并
提高测试稳定性。
var options = new ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--disable-gpu");
var driver = new ChromeDriver(options);
7.保持Selenium和驱动程序是最新版本
确保您使用的是最新版本的 Selenium WebDriver 和浏览器驱动程序。更新通常包括性能
改进和错误修复,以增强测试可靠性。
8.使用持续集成
将您的 Selenium 测试集成到 CI 管道中,以自动执行测试并立即获得有关代码更改的反馈。
Jenkins、Azure DevOps 和 GitHub Actions 等工具可以帮助您设置 CI 管道。
9.确保跨浏览器兼容性
跨不同浏览器测试您的应用程序,以确保跨浏览器兼容性。使用 Selenium Grid 或基于云的解决方
案(如 BrowserStack 和 Sauce Labs)在多个浏览器和平台上运行测试。
10.定期审查和重构你的测试
定期检查测试代码以确定需要改进的地方。重构测试以消除冗余、提高可读性并确保可维护性。
相关文章:
Selenium实践总结
1.使用显示等待而不是隐式等待 隐式等待可能会导致不可预测的测试行为,尤其是在动态 Web 应用程序中。显式等待,它允许您 等待特定条件发生后再继续测试,这种方法提供了更多的控制和可靠性。 WebDriverWait wait new WebDriverWait(drive…...

Python数据可视化小项目
英雄联盟S14世界赛选手数据可视化 由于本学期有一门数据可视化课程,课程结课作业要求完成一个数据可视化的小Demo,于是便有了这个小项目,课程老师要求比较简单,只要求熟练运用可视化工具展示数据,并不要求数据来源&am…...

Python毕业设计选题:基于python的白酒数据推荐系统_django+hive
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 白酒管理 系统管理 看板展示 系统首页 白酒详情…...

SQL-leetcode-180. 连续出现的数字
180. 连续出现的数字 表:Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中,id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…...

Unity中如何修改Sprite的渲染网格
首先打开SpriteEditor 选择Custom OutLine,点击Genrate 则在图片边缘会出现边缘线,调整白色小方块可以调整边缘 调整后,Sprite就会按照调整后的网格渲染了。 如何在UI中使用? 只要在UI的Image组件中选择Use Sprite Mesh 即可 结果࿱…...

跟着 8.6k Star 的开源数据库,搞 RAG!
过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还…...
每日一题 345. 反转字符串中的元音字母
345. 反转字符串中的元音字母 简单 class Solution { public:string reverseVowels(string s) {int l 0;int r s.size() - 1;unordered_set<char> st {a,A,E,e,i,I,O,o,U,u};while(l < r){while(l<r && !st.count(s[l]) ){l;}while(l<r &&…...
Stream API 的设计融合了多个经典设计模式
Stream API 的设计融合了多个经典设计模式: 1. 策略模式(Strategy Pattern) 策略模式定义了一个算法的家族,将每个算法封装起来,并使它们可以互换。Stream API 中的每个操作(如 filter(), map()ÿ…...

jmeter混合场景测试,设置多业务并发比例(吞吐量控制器)
jmeter混合场景测试,设置多业务并发比例(吞吐量控制器) 测试目的 为了验证需求提出的性能要求,结合实际可能的高压力场景,较全面的检测系统的性能表现。 测试方法 根据需求调研的业务模型和交易占比,设置不…...

直流有刷电机多环控制(PID闭环死区和积分分离)
直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。 实验环境 【 !】功能简介: 按下KEY1使能电机,按下…...
vue-axios+springboot实现文件流下载
前端vue代码: <template><div class"app-container documentation-container"><div><el-button type"primary" click"downloadFile(test.xlsx)">下载test.xlsx</el-button></div></div> …...

selenium执行js
JS知识 获取元素 document.getElement 移除属性:removeAttribute("xx") 窗口移动:window.scrollTo(0, document.body.scrollHeight)方法 drivier.execute_script(js)场景: 日期选择框,不能输入,只能设置…...

每日算法Day11【左叶子之和、找树左下角的值、路径总和】
404.左叶子之和 算法链接: 404. 左叶子之和 - 力扣(LeetCode) 类型: 二叉树 难度: 简单 思路:要判断一个节点是否为左叶子节点,只能通过其父节点进行判断。 题解: /*** Definition for a binary tree node.* public class Tr…...
分享一下使用 AI 开发个人工具的迭代过程
分享一下使用 AI 开发个人工具的迭代过程:1. 找 gpt/claude 要一个 super shady coder 的人设 prompt;2. 简单介绍项目背景和基础需求给 gemini,生成最初的细化需求;3. 根据细化需求再次分析,完善边界条件,…...

大型语言模型(LLMs)演化树 Large Language Models
大型语言模型(LLMs)演化树 Large Language Models flyfish 下面的图来自论文地址 Transformer 模型(如 BERT 和 GPT-3)已经给自然语言处理(NLP)领域带来了革命性的变化。这得益于它们具备并行化能力&…...
部分背包问题
本节学习解决部分背包问题,部分背包代表物品可以按照一定比例被分割,而后放入背包内.这是十分经典的用贪心算法解决的问题. 问题描述: 给定一些物品,用matrix表示各个物品的属性,第一项表示物品的质量,第二项表示物品的总价值.现有一背包最大承重为M,试求如何让背包中所装物品…...

教师管理系统
大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…...

Word论文交叉引用一键上标
Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击,标签为“替换为:”的文本框,注意光标一定要打在图红色方框圈中的文本框中! 4.点击格式选择字体 5.勾选上标…...

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!
本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中,企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…...

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...