验证元素是否存在并等待命令 Selenium

⚡ 智能摘要

验证元素是否存在并执行 waitFor 命令 Selenium IDE 会确认页面包含测试所需的元素和文本,并在动态条件变为真之前暂停播放,然后再运行下一步。

  • 🔘 元素检查: verifyElementPresent 当定位器与页面上的某些内容匹配时返回 TRUE,而 verifyElementNotPresent 则是它的完全相反的情况。
  • ☑️ 文本检查: verifyTextPresent 会搜索整个页面,并且区分大小写,因此“Atlanta”永远不会与“atlanta”匹配。
  • ✅ 位置检查: verifyElementPositionLeft 和 verifyElementPositionTop 比较元素与页面边缘的像素偏移量。
  • 🧪 页面加载完毕: andWait 命令(例如 clickAndWait)会暂停脚本,直到新页面加载完成。
  • 🛠️ 动态内容: waitFor 命令会等待某个条件满足,而不是等待页面加载,这适用于永远不会重新加载的 AJAX 屏幕。
  • 📊 当前IDE: 浏览器扩展程序会重命名这些步骤,并为每个等待命令设置自己的毫秒超时时间。

验证元素是否存在并执行 waitFor 命令 Selenium IDE

录制 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 IDE 脚本使用 verifyElementPresent 验证用户名框,使用 verifyElementNotPresent 验证名字框。

因为这些是 确认 命令而不是 断言 如果命令执行失败,则会在日志中记录失败信息,但剩余步骤仍会继续运行。下文将详细介绍这种区别。

验证命令中是否存在特定文本 Selenium

仅仅检查元素是否存在并不总是足够的——测试通常还需要确认向用户显示的文字。两个文本命令可以满足这种情况。

  • 验证文本存在 – 如果在页面的某个地方找到了指定的文本字符串,则返回 TRUE;否则,返回 FALSE
  • 验证文本不存在 – 如果在页面的任何地方都找不到指定的文本字符串,则返回 TRUE;如果找到了,则返回 FALSE

请记住,这些命令区分大小写。

下面的日志显示,同一页面被检查了两次,使用了两种不同的拼写方式来输入同一个短语。

Selenium IDE 日志显示,从亚特兰大到拉斯维加斯的 verifyTextPresent 验证通过,而从亚特兰大到拉斯维加斯的验证失败。

在上述示例中,“Atlanta to Las Vegas”和“atlanta to Las Vegas”的处理方式不同,因为前者中“Atlanta”的字母“A”是大写,而后者中是小写。对它们分别使用 verifyTextPresent 命令后,一个通过了验证,而另一个则失败了。

验证元素的特定位置

布局缺陷很少会导致定位器失效,因此存在性检查无法检测到它们。位置命令弥补了这一缺陷。

Selenium IDE 通过测量元素与浏览器窗口左边缘或上边缘的距离(以像素为单位)来指示元素的位置。

  • 验证元素位置左 – 验证指定的像素数是否与元素与页面左边缘的距离匹配。如果指定的值与与左边缘的距离不匹配,则返回 FALSE。
  • verifyElementPositionTop – 验证指定的像素数是否与元素与页面上边缘的距离匹配。如果指定的值与与上边缘的距离不匹配,则返回 FALSE。

以下脚本将预期的像素偏移量记录在“值”列中。

Selenium IDE 步骤使用 verifyElementPositionLeft 和 verifyElementPositionTop,并在“值”列中输入像素值。

请谨慎使用这两条命令。像素偏移量会随窗口大小、缩放级别和已安装的字体而变化,因此在一台机器上有效的硬编码数值在另一台机器上可能无效。

等待命令 Selenium

验证命令只能检查屏幕上已有的内容,因此即使应用程序运行正常,过早执行的检查也会失败。等待命令可以解决这个时序问题。

以下是等待命令的类型 Selenium

andWait 命令

这些命令将等待新页面加载后再转到下一个命令。

例子

  • 点击并等待
  • 键入并等待
  • 选择并等待

它们每一个都是带有 AndWait 后缀的普通操作命令,如下面的记录步骤所示。

记录了 clickAndWait 步骤,并保持 Selenium IDE脚本会一直运行,直到下一页加载完成。

waitFor 命令

这些命令会等待指定条件变为真,然后再继续执行下一个命令(无论是否加载新页面)。这些命令更适合用于基于 AJAX 的动态网站,这些网站可以更改值和元素而无需重新加载整个页面。示例包括:

  • 等待标题
  • 等待文本呈现
  • 等待警报

请考虑下面的 Facebook 场景。

Facebook 注册表单在点击链接前会显示“为什么我需要提供我的生日信息”的提示。

我们可以使用“click”和“waitForTextPresent”的组合来验证文本“Providing yourbirthday”的存在。

Selenium IDE 步骤与 waitForTextPresent 配对,等待输入您的生日文本

我们不能使用 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 命令。
  • 位置检查在本地通过,但在构建服务器上失败。 屏幕尺寸和字体渲染效果可能不同。建议使用文本检查或文本检测,或者在测试开始时明确设置窗口大小。
  • 整个套件在第一个不匹配的地方就停止了运行。 错误地记录了一个断言命令,而本应记录的是验证命令。更改前缀后,运行结果将报告所有失败情况,而不仅仅是第一个。

一旦脚本躲过了这些陷阱,下一步通常是…… 将运行时值存储在变量中 因此,检查是与真实数据进行比较,而不是与硬编码的字符串进行比较。

常见问题

旧版 IDE 在所有 waitFor 步骤中共享一个全局超时时间,并通过 setTimeout 命令进行更改。而当前的扩展程序在每个 wait 命令中都显式地设置了等待时间(以毫秒为单位),因此单个耗时的屏幕不再强制其他步骤等待相同的时间。

不。Pause 函数总是会暂停整个过程,因此页面加载速度快时会浪费时间,页面加载速度慢时仍然会失效。只有在演示过程中需要展示某个步骤时才应该使用它,千万不要在需要重复运行的测试套件中使用。

并非如此。“存在”指的是节点存在于 DOM 中,即使元素被 CSS 隐藏或定位在屏幕外,这个结论仍然成立。当测试依赖于用户看到某个元素时,需要在“存在”检查旁边添加“等待元素可见”的语句。

是的,而且当前的 IDE 也要求这样做。它的验证文本命令需要一个元素定位符加上预期的字符串,这比以前的页面级搜索更加严格,可以防止不相关的菜单项通过它原本不应该通过的检查。

Code export 命令会将每个命令转换为目标语言中的等效语句,因此等待步骤会变成显式的 WebDriver 等待。在信任生成的文件之前,请务必阅读该文件,因为超时和软故障/硬故障行为并非总能在转换过程中保持不变。

机器学习模型会读取历史运行数据,并标记那些间歇性而非持续失败的步骤,这正是缺少等待状态的特征。人工智能辅助定位器修复则通过在标记发生变化时提出新的选择器来解决另一个常见原因。

它能很好地处理机械部分——将等待步骤转换为具有预期条件的 WebDriverWait。 Rev查看它选择的超时时间和条件,因为生成的存在条件通常需要改为可见性条件。

定位器会针对当前选定的文档进行评估,而 iframe 则是一个独立的定位器。请先运行选择框架命令,然后再运行检查,之后返回到顶层文档,以避免后续步骤在错误的上下文中进行搜索。

总结一下这篇文章: