原子已应用于 Selenium IDE
分类
正如 Simon 在 原子化:为什么? 和 原子化:如何 中所提到的,Selenium 和 WebDriver 合并的部分目标是让两者之间共享通用代码。并且自 Selenium IDE 的 1.0.10 版本发布以来,此合并的代码“原子”现已包含在内。
此版本的早期用户注意到,驱动 assertAttribute 和 verifyAttribute 的原子导致他们的脚本中断。本文解释了“为什么”,并提出了如何修复它们的方法。
HTML 规范有一个布尔属性的概念,它仅通过存在而不是通过其值来执行操作; checked 和 selected 是两个这样的例子。可选地,您可以为这些布尔属性赋予与其名称相同的值 (checked=”checked”),您的页面仍然可以验证,但实际上,浏览器只关心属性是否存在。
在 1.0.10 之前,人们经常会这样做:
assertAttribute | checkbox@checked | checked
这会获取 ID 或名称为 checkbox 的复选框的 checked 属性值,如果该值不是 checked,则脚本会失败。
但在 1.0.10 中,即使它是 checked,也会失败。这是因为 checked 是一个布尔属性,现在将返回 true 或引发一个异常,指出该属性不存在。重新执行上述步骤以检查是否设置了布尔属性,结果如下:
assertAttribute | checkbox@checked | true
值得庆幸的是,与布尔属性的大多数实际交互都集中在 checked、disabled、hidden 和 selected 上,在这些情况下,使用 assertAttribute 并不是真正正确的方法。相反,Selenium API 提供了包装器供您使用。
checked | assertChecked(locator)、assertNotChecked(locator)、verifyChecked(locator)、verifyNotChecked(locator) |
disabled | assertEditable(locator)、assertNotEditable(locator)、verifyEditable(locator)、verifyNotEditable(locator) |
hidden | assertVisible(locator)、assertNotVisible(locator)、verifyVisible(locator)、verifyNotVisible(locator) |
selected | assertSelected*(locator, pattern)、assertNotSelected*(locator, pattern)、verifySelected*(locator, pattern)、verifyNotSelected*(locator, pattern) |
但是,检查缺少没有很好包装器的布尔属性有点麻烦。在此示例中,我正在检查布尔属性 multiple 是否不在名称为 elephants 的 select 元素上。
assertEval | this.browserbot.findElement("css=select[name=elephants]").getAttribute("multiple"); | null
如果您发现自己经常这样做,我建议您将其包装在 插件 中的用户扩展中,如下所示:
assertBooleanAttribute | css=select[name=elephants]@multiple | false
assertBooleanAttribute | css=select[name=elephants]@multiple | true
希望这可以解决一旦 Selenium IDE 1.0.10 得到更广泛的发行后,毫无疑问会出现的“我的脚本为什么会中断!?!?!?”问题。