对于在浏览器中测试 extjs 代码(最好使用 selenium)有什么建议吗?

2023-11-23

我们一直在使用 selenium 来处理高级网站测试(除了模块级别的大量 python 文档测试之外),并取得了巨大成功。然而,现在我们在很多页面上使用 extjs,并且事实证明很难将 Selenium 测试纳入网格等复杂组件。

有人成功为基于 extjs 的网页编写自动化测试吗?很多谷歌搜索都发现有类似问题的人,但答案很少。谢谢!


使用 Selenium 测试 ExtJS 的最大障碍是 ExtJS 不会渲染标准 HTML 元素,而 Selenium IDE 将天真地(并且正确地)生成针对仅充当装饰元素的命令 - 帮助 ExtJS 处理整个桌面的多余元素 -外观和感觉。以下是我在针对 ExtJS 应用程序编写自动化 Selenium 测试时收集的一些提示和技巧。

一般提示

定位元素

当通过在 Firefox 上使用 Selenium IDE 记录用户操作来生成 Selenium 测试用例时,Selenium 会将记录的操作基于 HTML 元素的 id。然而,对于大多数可点击元素,ExtJS 使用生成的 id,如“ext-gen-345”,即使没有进行任何代码更改,这些 id 也可能在后续访问同一页面时发生更改。记录测试的用户操作后,需要手动检查依赖于生成的 id 的所有此类操作并替换它们。可以进行两种类型的替换:

使用 CSS 或 XPath 定位器替换 Id 定位器

CSS 定位器以“css=”开头,XPath 定位器以“//”开头(“xpath=”前缀是可选的)。 CSS 定位器更简洁,更容易阅读,应该优于 XPath 定位器。然而,在某些情况下,可能需要使用 XPath 定位器,因为 CSS 定位器根本无法做到这一点。

执行 JavaScript

由于 ExtJS 执行的复杂渲染,某些元素需要的不仅仅是简单的鼠标/键盘交互。例如,Ext.form.ComboBox并不是真正的<select>元素,而是一个带有独立下拉列表的文本输入,该下拉列表位于文档树底部的某个位置。为了正确模拟组合框选择,可以首先模拟单击下拉箭头,然后单击出现的列表。然而,通过 CSS 或 XPath 定位器定位这些元素可能很麻烦。另一种方法是找到 ComoBox 组件本身并调用其方法来模拟选择:

var combo = Ext.getCmp('genderComboBox'); // returns the ComboBox components
combo.setValue('female'); // set the value
combo.fireEvent('select'); // because setValue() doesn't trigger the event

在硒中runScript命令可以用来以更简洁的形式执行上述操作:

with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }

应对 AJAX 和缓慢的渲染

Selenium 为所有命令提供“*AndWait”风格,用于在用户操作导致页面转换或重新加载时等待页面加载。但是,由于 AJAX 获取不涉及实际页面加载,因此这些命令不能用于同步。解决方案是利用视觉线索,例如 AJAX 进度指示器的存在/不存在或网格中行的出现、附加组件、链接等。例如:

Command: waitForElementNotPresent
Target: css=div:contains('Loading...')

有时,一个元素只会在一定时间后出现,具体取决于用户操作导致视图更改后 ExtJS 渲染组件的速度。而不是使用任意延迟pause命令,理想的方法是等待,直到我们可以掌握感兴趣的元素。例如,要在等待某个项目出现后单击该项目:

Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')

依赖任意暂停并不是一个好主意,因为在不同浏览器或不同机器上运行测试所导致的时间差异会使测试用例变得不稳定。

不可点击的项目

某些元素不能被触发click命令。这是因为事件侦听器实际上位于容器上,监视其子元素上的鼠标事件,这些事件最终会冒泡到父元素。选项卡控件就是一个例子。要单击选项卡,您必须模拟mouseDown选项卡标签上的事件:

Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0

现场验证

具有关联正则表达式或 vtypes 进行验证的表单字段(Ext.form.* 组件)将在一定延迟后触发验证(请参阅validationDelay属性默认设置为 250ms),用户输入文本后或字段失去焦点或模糊时立即(请参阅validateOnDelay财产)。为了在发出 type Selenium 命令在字段中输入一些文本后触发字段验证,您必须执行以下任一操作:

  • 触发延迟验证

    当字段接收到 keyup 事件时,ExtJS 会触发验证延迟计时器。要触发这个计时器,只需发出一个虚拟的 keyup 事件(无论您使用哪个键,ExtJS 都会忽略它),然后是一个比validationDelay长的短暂暂停:

    Command: keyUp
    Target: someTextArea
    Value: x
    Command: pause
    Target: 500
    
  • 触发立即验证

    您可以将模糊事件注入该字段以触发立即验证:

    Command: runScript
    Target: someComponent.nameTextField.fireEvent("blur")
    

检查验证结果

验证后,您可以检查是否存在错误字段:

Command: verifyElementNotPresent   
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]

Command: verifyElementPresent   
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]

请注意,“display: none”检查是必要的,因为一旦显示错误字段,然后需要隐藏它,ExtJS 将简单地隐藏错误字段,而不是将其从 DOM 树中完全删除。

特定于元素的提示

单击 Ext.form.Button

  • Option 1

    命令:点击 目标:css=button:contains('保存')

    通过标题选择按钮

  • Option 2

    命令:点击 目标:css=#save-options 按钮

    通过 id 选择按钮

从 Ext.form.ComboBox 中选择一个值

Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }

首先设置值,然后在存在观察者的情况下显式触发 select 事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于在浏览器中测试 extjs 代码(最好使用 selenium)有什么建议吗? 的相关文章

随机推荐

  • 在 https iframe 内注册服务工作人员时出现 DOMException

    我正在尝试在 http 不安全 站点内的 https iframe 中注册服务工作者 直到最近 我的代码运行没有任何问题 从上次 chrome 更新 44 开始 此代码在 iframe 内失败 navigator serviceWorker
  • 映射区域的权限错误[重复]

    这个问题在这里已经有答案了 尝试运行以下函数时出现错误 char reverseInPlace char src no need to alloc or free memory int i 0 int size mystrlen src f
  • 如何在 Type 上使用 switch-case? [复制]

    这个问题在这里已经有答案了 可能的重复 还有比 打开类型 更好的选择吗 我需要遍历类的所有属性 并检查其类型是否为 int 我需要执行某些操作 如果其为 string 则执行某些操作 我需要它使用 switch case 这里我按以下方式使
  • 列出nodejs中的分区

    我想使用nodejs 获取Windows 中的分区列表 fs readdir 对于任何低于或包括 C 的文件夹都可以正常工作 但我不知道要给它什么才能拥有 C D 等分区列表 有人知道我应该用什么吗 Node js 中没有用于列出分区的 a
  • 如何在 .NET 中的大文件中间插入或删除字节

    是否有可能有效率的从大文件的中间插入或删除字节 如果是这样怎么办 或者我是否在插入或删除数据后重写整个文件 A lot of Bytes Unwanted Bytes A lot of Bytes gt A lot of Bytes A l
  • ul 列表不会在按键时滚动,但可以使用鼠标滚轮滚动

    我正在使用 Bootstrap 3 并且有一个 autossugest 输入 问题是我想要 ul 使用键盘按键滚动但不起作用 我认为使用箭头键滚动是默认行为 但 ul 不这样做 这是正在发生的事情 如果我按向下键两次 我正在使用预先输入由巴
  • 使用 json 将图像上传到 djangorestframework 的 imagefield 并使用 CURL 进行测试

    我在djangorest框架中制作了几个api 我可以使用 api 的 html 形式进行测试 就像在命令行中使用curl 一样 现在我有一个模型的 api 其中一个字段是 ImageField 我不知道该使用哪个curl 命令 使用我在
  • 编译为 1.5 编写的 Java 代码以与 1.4 JRE 一起使用?

    我有一个使用泛型和一些 Java 1 5 6 的项目 是否可以编译此代码以在运行 1 4 JRE 的系统上运行 我使用 ANT 构建脚本和 javac 任务来编译该库 当目标属性为 1 5 时 此构建效果良好 如果我将目标更改为 1 4 则
  • 如何在不执行 Spark SQL 表达式的情况下验证它?

    我想验证 Spark sql 查询在语法上是否正确 而无需在集群上实际运行查询 实际用例是我正在尝试开发一个用户界面 它接受用户输入 Spark sql 查询 并且我应该能够验证提供的查询在语法上是否正确 另外 如果在解析查询之后 我可以就
  • 使用默认内容块生成 content_for

    我们的 Rails 项目大量使用content for 然而 如果没有使用定义任何内容 我们经常需要渲染默认内容content for 为了可读性和可维护性 将此默认内容放在一个块中是有意义的 我们在 Rails 2 3 中创建了一个辅助方
  • JavaScript 使用逻辑运算符切换?

    for var count 1 count lt 6 count switch count case 2 document write hi break case count gt 3 document write bye break ca
  • 如何在正在编写的另一个 jQuery 插件中包含外部插件

    我正在为我正在进行的项目构建一个自定义 jQuery 插件 我想返回一个自定义到另一个 jQuery 插件的对象 而不是必须确保使用我的插件的每个页面也有这个其他插件 是否可以将其包含在实际的插件本身中 而不是在使用我的插件的每个页面上键入
  • 自动检测移动浏览器(通过用户代理?)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何检测用户是否正在通过移动网络浏览器查看我的网站 以便我可以自动检测并显示我的网站的适当版本 上面有开源脚本检测移动浏览器在 Apache ASP ColdFusion Jav
  • Python:排除模块 Pyinstaller

    我开始使用 Pyinstaller 而不是 Py2Exe 然而我很快就遇到了问题 如何排除不需要的模块 以及如何查看包含在单个可执行文件中的模块 我可以删除一些pyd and dll我的 Python 安装中的 DLL 文件夹中的文件 因此
  • 使用 Fluent 验证的 Model T 通用验证器?

    我昨天刚刚了解 Fluent Validation 我认为它非常酷 我已经尝试过并且有效 但我的应用程序目前有多个模型 我必须承认为每个模型编写验证器的压力很大 是否有可能用泛型编写它并找到一种方法来验证每个模型 这就是我的验证器目前的编写
  • 向量的数据如何对齐?

    如果我想处理数据std vector对于 SSE 我需要 16 字节对齐 我怎样才能做到这一点 我需要编写自己的分配器吗 或者默认分配器是否已与 16 字节边界对齐 C 标准需要分配函数 malloc and operator new 为任
  • vbscript 中的 CommonAppData

    客户的应用程序 AppName 的配置文件存储在 CommonAppData 中 在 Windows XP 下是C Documents and Settings All Users Application Data AppName 在 Wi
  • Spring Boot 执行器健康指示器

    我们现在已经在几个项目中使用Spring Boot 我们使用的是最新版本1 2 3 我们正在合并执行器 到目前为止 一切运行良好 除了我们发现 health 指示器 默认 显示服务已关闭 这不是真的 这些服务是通过数据源实现的 它可能会调用
  • 从数组到列表的隐式转换

    如何编写隐式转换Array to List 类型 我尝试了以下方法 但似乎不起作用 scala gt implicit def arrayToList A ClassManifest a Array A List A a toList
  • 对于在浏览器中测试 extjs 代码(最好使用 selenium)有什么建议吗?

    我们一直在使用 selenium 来处理高级网站测试 除了模块级别的大量 python 文档测试之外 并取得了巨大成功 然而 现在我们在很多页面上使用 extjs 并且事实证明很难将 Selenium 测试纳入网格等复杂组件 有人成功为基于