验证元素是否存在并等待命令 Selenium
录制 Selenium IDE 脚本会执行点击和输入操作,但它本身无法判断应用程序的行为是否正确。这项工作由两类命令完成: 确认 用于检查页面状态的命令,以及 等待 命令会暂停执行,直到页面准备好进行检查。
⚠️ 关于版本的说明: 以下截图均来自原版 Firefox-插入 Selenium 该 IDE 已停止分发,并且他们使用其驼峰式 Selenese 名称。当前的 IDE 是 Chrome。 Firefox 和边缘 浏览器扩展此处描述的行为仍然适用,但一些命令名称已更改——映射ping 表格将在本文后面出现,所有原始命令和屏幕截图均按原样保留。
验证元素的存在
我们可以使用以下两个命令来验证元素的存在:
- 验证元素是否存在 – 如果在页面中找到指定元素,则返回 TRUE;否则返回 FALSE
- 验证元素不存在 – 如果在页面的任何地方都找不到指定的元素,则返回 TRUE;如果存在,则返回 FALSE。
这两个命令都需要一个元素 定位器 ,在 Target 字段——可以是 ID、名称、CSS 选择器、链接文本或 XPath的 表达式——两者都不需要值。
下面的测试脚本验证用户名文本框是否存在于 Mercury Tours 主页,而 First Name 文本框不是。First Name 文本框实际上是注册页面中的一个元素 Mercury 旅游,不在主页上。
因为这些是 确认 命令而不是 断言 如果命令执行失败,则会在日志中记录失败信息,但剩余步骤仍会继续运行。下文将详细介绍这种区别。
验证命令中是否存在特定文本 Selenium
仅仅检查元素是否存在并不总是足够的——测试通常还需要确认向用户显示的文字。两个文本命令可以满足这种情况。
- 验证文本存在 – 如果在页面的某个地方找到了指定的文本字符串,则返回 TRUE;否则,返回 FALSE
- 验证文本不存在 – 如果在页面的任何地方都找不到指定的文本字符串,则返回 TRUE;如果找到了,则返回 FALSE
请记住,这些命令区分大小写。
下面的日志显示,同一页面被检查了两次,使用了两种不同的拼写方式来输入同一个短语。
在上述示例中,“Atlanta to Las Vegas”和“atlanta to Las Vegas”的处理方式不同,因为前者中“Atlanta”的字母“A”是大写,而后者中是小写。对它们分别使用 verifyTextPresent 命令后,一个通过了验证,而另一个则失败了。
验证元素的特定位置
布局缺陷很少会导致定位器失效,因此存在性检查无法检测到它们。位置命令弥补了这一缺陷。
Selenium IDE 通过测量元素与浏览器窗口左边缘或上边缘的距离(以像素为单位)来指示元素的位置。
- 验证元素位置左 – 验证指定的像素数是否与元素与页面左边缘的距离匹配。如果指定的值与与左边缘的距离不匹配,则返回 FALSE。
- verifyElementPositionTop – 验证指定的像素数是否与元素与页面上边缘的距离匹配。如果指定的值与与上边缘的距离不匹配,则返回 FALSE。
以下脚本将预期的像素偏移量记录在“值”列中。
请谨慎使用这两条命令。像素偏移量会随窗口大小、缩放级别和已安装的字体而变化,因此在一台机器上有效的硬编码数值在另一台机器上可能无效。
等待命令 Selenium
验证命令只能检查屏幕上已有的内容,因此即使应用程序运行正常,过早执行的检查也会失败。等待命令可以解决这个时序问题。
以下是等待命令的类型 Selenium
andWait 命令
这些命令将等待新页面加载后再转到下一个命令。
例子
- 点击并等待
- 键入并等待
- 选择并等待
它们每一个都是带有 AndWait 后缀的普通操作命令,如下面的记录步骤所示。
waitFor 命令
这些命令会等待指定条件变为真,然后再继续执行下一个命令(无论是否加载新页面)。这些命令更适合用于基于 AJAX 的动态网站,这些网站可以更改值和元素而无需重新加载整个页面。示例包括:
- 等待标题
- 等待文本呈现
- 等待警报
请考虑下面的 Facebook 场景。
我们可以使用“click”和“waitForTextPresent”的组合来验证文本“Providing yourbirthday”的存在。
我们不能使用 clickAndWait,因为点击“为什么我需要提供我的生日?”链接时没有加载任何页面。如果我们这样做,测试将失败
同样的规则也适用于通过脚本而非导航注入的任何内容,这就是为什么 基于 AJAX 的屏幕 几乎总是需要 waitFor 而不是 andWait。
断言、验证和等待命令 Selenium IDE
初学者经常选错程序集,然后纳闷为什么程序在第一个缺陷就停止运行,或者为什么会报告二十个故障,而这些故障实际上都是由其他原因造成的。 trac又回到了原点。这三个前缀回答了三个不同的问题。
| 字首 | 它做什么 | 失败 | 最适合用于 |
|---|---|---|---|
| 断言 | 立即检查状况 | 记录失败并停止测试用例 | 前提条件——登录必须成功,其他一切才能生效。 |
| 确认 | 立即检查状况 | 记录失败信息并继续执行下一个命令 | 独立核查,例如确认页面上的多个标签 |
| 等待 | 民意调查直到条件成立为止 | 超时后记录失败信息,然后继续执行。 | 任何出现延迟的内容——AJAX响应、加载指示器、对话框 |
一个实用的模式结合了这三者:首先,断言你访问的页面正确;其次,等待异步到达的元素;最后,逐个验证每个字段。按此顺序执行意味着,即使导航出现问题,测试也会提前终止;而少数几个细微的页面不匹配也会在一次运行中全部报告出来。同样的原则也适用于…… Selenium 用代码编写的测试,其等效项包括硬断言、软断言和显式等待。
当前系统中的验证和等待命令 Selenium IDE
此 Firefox用于生成上述屏幕截图的插件 IDE 已停止维护,命令集已针对当前的浏览器扩展程序进行了重建。一些 Selenese 名称被保留,一些被重命名,还有一些被删除。下表将本文中使用的命令与其当前对应的命令进行了映射,这些命令取自官方文档。 Selenium IDE 命令参考.
| 塞勒涅斯传统命令 | 当前 IDE 中的命令 |
|---|---|
| 验证元素是否存在 | 验证元素是否存在 |
| 验证元素不存在 | 验证元素不存在 |
| 验证文本存在 | 验证文本(范围限定于元素定位器,而非整个页面) |
| 验证文本不存在 | 验证非文本(限定于元素定位器) |
| 验证标题 | 核实标题 |
| verifyElementPositionLeft / verifyElementPositionTop | 没有等效项——立场断言已被删除 |
| 点击并等待、输入并等待、选择并等待 | 没有 AndWait 后缀——open 命令本身就会等待页面加载完成。 |
| 等待元素出现 | 等待元素出现,等待时间以毫秒为单位。 |
| 等待警报 | 对话框出现后,确认或验证警报文本 |
日常工作中最重要的两点变化是:首先,当前的等待命令——等待元素存在、等待元素可见、等待元素可编辑及其否定形式——都明确指定了等待时间(以毫秒为单位),因此执行较慢的步骤不再需要共享全局超时时间。其次,页面范围的文本搜索功能已被移除:验证文本需要定位符,而定位符通常能提供更精确的检查结果。
Verify 和 waitFor 命令的常见错误
大多数已报告的命令问题并非集成开发环境 (IDE) 的缺陷。以下列表涵盖了最常见的故障及其解决方法。
- 元素存在,但检查仍然失败。 存在性和可见性是不同的状态。即使元素被 CSS 规则隐藏,它仍然存在于 DOM 中,因此,当测试依赖于用户实际看到元素时,应将存在性检查与等待元素可见的操作结合起来。
- 文本检查无法识别完全相同的文字。 从设计文档中复制的不间断空格、尾随空格和弯引号都会破坏精确匹配。请手动重新输入所需的字符串,而不是粘贴。
- 页面明明已经加载完毕,但等待命令却超时了。 该元素通常位于 iframe 内。请先运行 selectframe,否则定位器会针对错误的文档进行评估。
- clickAndWait 在单页应用程序中会卡住。 由于没有发生导航操作,因此无需等待。请将其替换为单击操作加上相应的 waitFor 命令。
- 位置检查在本地通过,但在构建服务器上失败。 屏幕尺寸和字体渲染效果可能不同。建议使用文本检查或文本检测,或者在测试开始时明确设置窗口大小。
- 整个套件在第一个不匹配的地方就停止了运行。 错误地记录了一个断言命令,而本应记录的是验证命令。更改前缀后,运行结果将报告所有失败情况,而不仅仅是第一个。
一旦脚本躲过了这些陷阱,下一步通常是…… 将运行时值存储在变量中 因此,检查是与真实数据进行比较,而不是与硬编码的字符串进行比较。






