您所工作的网站上很可能有一堆表单。登录和注册表单、付款表单、联系表单、评论表单等。测试这些表单是个好主意。当然,自动化测试是个好主意。处理表单数据并测试结果的后端测试。测试前端功能是否按预期执行的前端测试。
但还有手动测试。比如,我想用我的眼睛、键盘、鼠标和情感等等来测试它。这可能是设计师最常见的测试类型。当然,仅仅手动填写表单是个好主意,但一遍遍地这样做会变得非常乏味,以至于您(倒吸一口冷气)可能不会经常这样做。
也许我们可以在我们的网站上添加一小段代码,以便在我们需要时预填充它们。
从模板中预填充
一种可能性是从模板本身一直预填充。例如,您可以检查您是否在开发域上,然后预填充值。比如
<?php
if ($_SERVER['HTTP_HOST'] == "mysite.dev") {
$prefill = true;
}
?>
<input type="text"
name="name"
id="name"
<?php if ($prefill) { ?>
value="Chris Coyier"
<?php } else { ?>
value=""
<?php } ?>
>
或者 Rails 式的方法
<input type="text"
name="name"
id="name"
<% if Rails.env.development? %>
value="Chris Coyier"
<% else %>
value=""
<% end %>
>
这样做的问题在于,您始终会在开发环境中看到表单已填充,但这与用户遇到的情况不同。我更倾向于保留用户看到的表单,然后根据需要选择性地填充它。
使用 JavaScript 预填充
使用与上面相同的测试-如果-开发内容,我们可以将新的脚本插入页面以进行预填充。
<?php if ($_SERVER['HTTP_HOST'] == "mysite.dev") { ?>
<script src="/assets/development/form-prefiller.js"></script>
<?php } ?>
您可以采用几种方法
- 自动预填充找到的字段
- 插入一些按钮以进行预填充
- 只需提供一些可以在控制台中手动调用的公共函数
如果您要自动预填充,使用 JavaScript 没有太多优势。出于此演示的目的,我将创建按钮。实际上,我只是将其留给控制台。
脚本的一个非常简单的版本可能是这样的
var PrefillMachine = {
prefillCorrectly: function() {
$("#name").val("Chris Coyier");
}
}
然后,无论何时您在包含表单的页面上,只需打开控制台并键入
PrefillMachine.prefillCorrectly();
或者如果您页面上有一些按钮
var PrefillMachine = {
init: function() {
this.bindUIActions();
},
bindUIActions: function() {
// Probably even best to insert this button with JS
$("#prefill-correct").on("click", this.prefillCorrectly);
},
prefillCorrectly: function() {
$("#name").val("Chris Coyier");
}
}
PrefillMachine.init();
预填充值和类型
预填充一些设置值是一回事,但您可能希望对其进行一些随机化。例如,在注册表单上反复预填充相同的用户名并没有多大帮助,因为您的系统可能会将其拒绝为重复项。因此,让我们进行一些随机化!
在我们的 PrefillMachine 对象中,我们可以创建一个函数来为我们提供随机字符串
_makeId: function() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i=0; i < 5; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
return text;
},
当我们调用它时,它会给我们提供诸如 eQthY、Jv1ea 或 Cmy4g 之类的内容。重复的可能性很小。
因此,如果我们正在预填充姓名和用户名,例如,我们可能会使我们的预填充函数如下所示
prefillCorrectly: function() {
var id = this._makeId();
$("#name").val("name_" + id);
$("#username").val("username_" + id);
...
我们只是在这些随机值前面添加前缀,以便如果我们想将它们删除或执行其他操作,可以在数据库中轻松找到它们。
测试电子邮件地址?也许使用该随机值作为 Gmail 地址的扩展名。这样它就是唯一的,但您仍然会收到电子邮件。
$("#email").val("chriscoyier+" + id + "@gmail.com");
复选框、单选按钮和选择框怎么办?随机选择这些选项可能很好。我们可以做一个超级快速的随机数生成器
_rand: function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
然后假设有一个有两个选项的单选按钮组,我们可以将它们都关闭,随机选择一个,然后将其重新打开
$("input[name='radio-choice']")
.prop("checked", false)
.eq(this._rand(0, 1))
.prop("checked", true);
选择类似地也很容易
$("#select-choice")
.find("option")
.prop("selected", false)
.eq(this._rand(0, 2))
.prop("selected", true);
随机化街道地址?
$("#address").val(this._rand(1000, 9000) + " Super St.");
您明白了。

错误地预填充
也许与正确预填充表单一样有用的是,您可以通过错误地预填充来测试错误状态。只需为执行此操作创建另一个函数即可
prefillIncorrectly: function() {
// Empty should be invalid
$("#name").val("");
$("#username").val("");
// Space should make invalid
$("#email").val("jim @jim.com");
// Force them not to match AND one is blank.
$("#pw").val("123");
$("#pw-repeat").val("");
// Turn both off.
$("input[name='radio-choice']")
.prop("checked", false);
// Not enough numbers
$("#cc").val("424242424242");
// Values are wrong
$("#exp-1").val("50");
$("#exp-2").val("02");
$("#cvv").val("abc");
// Left unchecked
$("#agree-terms").prop("checked", false);
},
然后根据需要调用它。然后您可以提交并查看您的错误处理系统是否正常工作。

您甚至可能将所有这些用作端到端测试之类内容的一部分,但我将将其留给更聪明的人。
演示
这是一个所有内容的示例
查看 Chris Coyier 在 CodePen 上的笔 pzKtx(@chriscoyier)。
感谢 Tim Sabat 向我介绍了这个想法。他想出了这个主意并在 CodePen 上实现了它,以便使我们所有人的测试变得更容易。
有趣的想法,Chris!虽然我个人不喜欢用 PHP 标签和开发脚本包含来弄乱我正在处理的页面。
如果使用 Chrome(也许 Firefox 也允许),您可以在 DevTools 中保存代码片段(Sources > Snippets),然后您可以运行它们(右键单击 > 运行)。它使代码保持干净,并通过添加开发人员工具来充分利用 DevTools。:P
此外,关于表单填充,有一些浏览器扩展程序可以一键完成,例如 此扩展程序。
它仅适用于桌面开发,但在典型的移动设备上,插件不是一种选择。如果您正在开发表单,您很可能确切地知道它将接受哪些数据,以及是否存在仅在某些情况下出现的或在某些情况下行为不同的字段,
设置一堆 jQuery 选择器将比学习仅用于桌面的插件结构快得多,并希望它能满足所有需求。
此外,如果您考虑大型开发团队,一旦您提交了包含它的 js 文件和模板,所有开发人员都将在所有平台上都能使用它,而插件则需要转到每台计算机(和浏览器)上进行安装和配置
我多年来一直在使用此书签 https://github.com/dsheiko/autofill。它为我服务良好
这也是我首选的方法。
书签与 ChanceJS 结合使用以生成随机数据。
Dimitry,非常有用的书签,谢谢
Branden,与 ChanceJS 结合听起来像是一个完美的解决方案。如果您能抽出时间详细说明您是如何进行实际“组合”的,这对我们这些不太熟练的人来说将非常棒!无论如何,非常有用,谢谢。
太棒了!我惊讶地发现我以前从未听说过。
如果您想让它做更多的事情,修改起来非常容易。并且您可以将链接传递给相关的开发人员。
感谢分享。
我个人仍然更喜欢每次手动填写表单——我打字速度很快!
太棒了。谢谢,Chris!
我经常使用 Gravity Forms,因此正在重构以使其更通用。例如
不错,为了更快地开发使用 jQuery 方法的后预订页面,我对我们公司的网站做了同样的事情。
一个人可以打字非常快,以填写 10 个输入字段、4 个选择菜单和几个复选框,但从速度上来说,没有任何东西能比得上单击。如果操作需要重复很多次,这一点就更加重要,这是一种运行诸如 grunt.js 之类项目的理念,“如果需要执行多次,请自动化”。
Chrome 也有一些插件可以做到这一点,但如果我们也考虑移动设备,JS 解决方案会更有效,用物理键盘在桌面上重新键入相同的表单是一回事,但在启用了自动更正功能的 iPhone 或 Android 智能手机上尝试一下,您很快就会变得很疯狂。
书签小程序非常理想(避免污染源代码),或者您可以制作一个用户脚本(Chrome 中有原生支持,Firefox 中通过 GreaseMonkey 支持,Safari 中通过 CreamMonkey 等支持,Opera 中通过 Violet Monkey 支持)。
我个人永远不会在最终会进入生产环境的代码中添加特定于开发的分支——在我工作的领域,遗漏或滥用的风险实在太大了。
我一直在开发一个 Chrome 扩展程序 Formbot,它非常适合表单预填充。您可以让它生成随机数据或为不同类型的输入设置特定数据。
我使用 LastPass,它有一个表单填充按钮,其中一个我已设置为测试(包含虚假/测试 Visa),所以我只需点击该按钮即可。不过,它不处理复选框和单选按钮。巧妙的解决方案。
我做的也是一样。
太费劲了 :-p
但是非常有用 :-)
有时候你让我思考为什么我之前没想到这样。你的想法如此清晰和切合实际
谢谢。
如果您使用像 Laravel Blade/Mustache/Handlebars/Django 这样的模板语言,您可以将值传递到表单,然后从生产环境模型中删除该数据。
如果
test的模型值为空,则不会呈现任何内容,并且就浏览器而言,值字符串为空。我非常喜欢 Formlet Firefox 扩展程序。手动填写表单一次,然后 Formlet 将表单数据保存到书签小程序中。书签小程序完全是可移植的原生 JavaScript。换句话说,执行书签小程序不需要该扩展程序,因此您可以将其发送给同事等。
它处理所有表单元素,如复选框、单选按钮、文本区域等等。无需在代码中进行任何修改,并且可以节省大量时间。
我使用 Chrome 扩展程序 FormFiller(https://chrome.google.com/webstore/detail/form-filler/bnjjngeaknajbdcgpfkgnonkmififhfo)。我更喜欢使用它,因为我不必编写任何额外的代码提交到源代码控制中。
我在几个项目之前写了一个 gist 来实现这个功能,使用了十个最常见的男孩和女孩的名字以及 20 个最常见的姓氏,一个虚构的 Twitter 句柄,加上来自 http://www.fillmurray.com 的个人资料照片和来自 http://json-lipsum.appspot.com 的一些乱数文字。为我节省了大量时间,但也让我收到了客户的担忧询问,他们想知道这些人是从哪里来的。
https://gist.github.com/chris5marsh/8455299
有时候你让我思考为什么我之前没想到这样。你的想法如此清晰和切合实际
谢谢
非常酷。我们经常使用 cookie 来打开此类特定于开发的设置。因此,您可以将 prefiller.js 包裹在一个检查中,以查看是否存在名为 debug==tru 的 cookie。
FormFiller 看起来非常有前景。简单明了!感谢您的撰写,Chris!一如既往地精彩有趣。