在网站或应用程序中,表单往往是实现转化目标的关键所在。那些被放弃的购物车、只填写了部分信息的用户,以及不再使用你的应用的用户,往往都是因为表单操作存在障碍才导致这些情况的。

当人们无法理解错误信息,或者难以顺利填写表单中的各项内容,又或是不能立即获得所需的帮助时,他们也很可能会离开这个网站或应用程序。

本指南将向你展示如何创建自动化系统,以便在用户遇到这些问题之前就及时发现它们。我们将一起编写代码,对这些表单进行系统的检查,这样你就无需手动逐一检查每个字段来寻找问题了。

接下来我们将会共同完成以下内容:

  • 编写脚本,确保错误信息具有实用性且具体明确,而不会显得笼统烦人。

  • 实施自动化检测机制,保证提示文字能够出现在合适的位置,并在适当的时间显示出来。

  • 进行测试,确保使用键盘的用户可以顺利地填写表单,而不会迷失方向或遇到障碍。

  • 建立一套全面的审计系统,自动执行这些检查,并为你提供按优先级排序的修改建议列表。

  • 将这套系统集成到你的开发流程中,这样每次你修改代码时,这些检查都会自动被执行。

读完本手册后,你将能够做到以下几点:

  • 为任何应用程序表单配置自动化审计功能。

  • 根据无障碍设计指南和可用性最佳实践来验证错误信息的内容。

  • 确保提示文字能帮助用户而不是让他们感到困惑。

  • 通过键盘导航测试,确认所有用户都能顺利完成表单填写。

  • 将审计结果与实际的业务指标(如转化率)联系起来进行分析。

  • 在部署过程中自动运行这些审计任务。

每一节中的功能性JavaScript代码都可以立即进行测试。由于这些示例使用的都是纯JavaScript,因此它们可以与任何框架配合使用,包括React、Vue、Angular或单纯的HTML。虽然你不需要成为JavaScript专家,但只要具备基本的理解能力,就能充分利用本指南的内容。

目录

  1. 为什么首先要自动化表单审计?

  2. 如何明确审计的目标和范围

  3. 如何界定审计的范围

  4. 如何结合启发式评估与定量数据

  5. 如何为表单组件定义自动化测试用例

  6. 如何持续验证键盘导航流程是否顺畅

  7. 基于人工智能的导航模式检测技术

  8. 结论

为什么首先要自动化表单审核呢?

手动测试通常能够发现一些简单的问题,但可能会忽略整个应用程序中表单存在的系统性缺陷。你们应该明白我指的是哪些类型的错误——比如那些没有显示错误信息、某些字段缺乏键盘支持,或者提示信息的位置设计不合理、导致用户无法轻松获取帮助的情况。

关于用户体验设计的研究表明,通过建立持续的反馈机制,可以有针对性地优化和设计出优秀的用户体验(来源:Okonkwo, Research Gate)。自动化审核正是将这一理念付诸实践的有效手段,因为它能帮助你在产品发布之前全面发现潜在问题。

这里的关键优势在于其覆盖范围广泛。你可以提前准备相关的审核流程和工具,这样你和你的团队就能系统地检查每一个表单字段、验证规则以及键盘交互功能。

需要审核的关键表单组件

在制定用户体验审核计划之前,我们先来了解一下那些最容易出问题的表单元素:

  • 错误提示信息能清楚地说明问题所在以及解决方法。这些提示越具体、越易于理解,就越能有效帮助用户解决问题。比如“电子邮件地址必须包含@符号”这样的具体提示,比笼统的“输入无效”更加有用。

  • 提示文本

    可以在用户开始输入数据之前就预防错误的发生。像“密码长度必须至少为8个字符”这样的主动提示,能让用户对操作结果有明确的预期。将提示文本放在合适的位置,并在适当的时候显示出来,也是决定其效果的关键因素。

  • 键盘使用流程

    决定了用户是否能够不使用鼠标就能完成表单填写。标签顺序、焦点顺序以及快捷键设置,都会影响这一体验。

为了指导大家完成针对这些组件的审核工作,我们将重点分析三种常见的用户操作流程:注册表单、结账流程以及联系表单。这些流程都会直接影响产品的转化率,而且每个组件都与多个可追踪的指标相关联。

在制定审核标准时,我们会参考尼尔森·诺曼集团的10条可用性准则(来源:Jakob Nielsen, NNgroup),并结合其他数据指标来进行评估。这些准则包括:

  • 系统状态的可见性:用户应该能够通过及时的反馈信息了解系统的当前状态。

  • 系统表述与实际需求的一致性:使用用户熟悉的语言,避免使用专业术语。

  • 用户的自由度与控制权:让用户能够快速纠正错误。

  • 一致性与标准化:遵循统一的平台规范,避免用户对不同元素的含义产生困惑。

  • 错误的预防:从设计阶段就尽量避免问题的发生。

  • 直观性而非记忆依赖:直接展示选项,而不是要求用户去记住详细信息。

  • 使用的便捷性与效率:为有经验的用户提供快捷方式,同时保持界面对初学者的友好性。

  • 简洁美观的设计风格:避免在界面上添加无关的信息,保持清晰整洁。

  • 帮助用户识别、诊断并解决错误:错误提示应清楚地说明问题并提供解决方案。

  • 辅助资源与文档支持:在需要时提供易于查找的帮助资料。

在表单审核中,我们将重点关注以下几条经验法则:#5(通过提示文本预防错误)、#6(使需求信息清晰可见)以及#9(明确的错误处理机制)。这些因素直接关系到用户是否能够成功完成表单填写。

在继续之前,还有另一件重要的事情需要注意。对于每个表单组件,你需要确定哪些测试可以自动化进行。针对每个表单组件,应从以下几个方面编写程序化的检查代码:

  • 可访问性——包括对比度、ARIA标签以及焦点指示器的设置。

  • 性能——验证字段内容及显示错误信息所需的时间。

  • 视觉一致性——错误状态的显示方式、提示文本的格式以及键盘焦点的定位。

我们会优先处理那些能够有效防止用户放弃表单填写的缺陷。此外,每次审核都会提供可操作的修改建议,同时附带相应的代码示例、验收标准及修改方案。

现在,让我们开始构建表单用户体验审核的工作流程吧。

如何明确目标与范围

在开始操作之前,你必须先确定自己究竟要测量什么,以及测量的目的何在。有一条重要的原则:模糊的表述必然会导致模糊的结果。只有将具体的目标与用户行为及业务指标联系起来,才能使审核工作具有实际意义。

识别表单类型与目标

首先,你需要明确自己要审核的是哪种类型的表单。让我们先分析那些对应用程序的成功具有直接影响的三种表单,并明确它们各自的具体目标和特点。

1. 注册表单的核心目标是吸引新用户。

任何会阻碍用户操作的因素——比如不明确的密码要求、对电子邮件格式的模糊规定,或者缺乏字段标签——都可能导致用户放弃注册流程。在审核过程中,必须找出这些潜在的问题。

2. 结账表单的目的是促进收入生成

当应用程序遵循以用户为中心的设计原则时,用户的参与度会显著提高——这一点可能令人感到惊讶吧?(来源:Okonkwo, ResearchGate)。在结账流程中,这意味着错误信息应直接显示在输入框旁边,提示文本应在用户开始输入前就说明填写要求,而键盘导航顺序也应符合从配送信息到支付信息的常规逻辑。

3. 联系表单的目的是建立沟通渠道

通常,开发人员对联系表的关注程度低于对交易表格的关注。但实际上,联系表在处理提案请求、客户支持申请、协作请求等各种事务时起着至关重要的作用。如果联系表出现故障,就可能会导致业务机会的流失。

既然你已经明确了表单的类型及其核心目标,接下来我们就需要做一件同样重要的事情:将这些高层次的目标与具体且可量化的指标联系起来。

将目标与可追踪的指标关联起来

审计中设定的每一个目标都对应着一组具体的衡量标准。以下是构建这种关联关系的方法:

错误信息相关指标

你的审计应该评估这些错误信息是否满足以下三个标准:

  1. 具体性(该信息能否明确指出问题所在?)

  2. 时机性(用户会在什么情况下看到这些错误信息?)

  3. 可操作性(该信息能否告诉用户应该采取哪些措施来解决问题?)

例如,“密码太弱”这样的提示并无法提供具体的解决方法,也不够具体;而“密码必须包含至少一个大写字母、一个数字以及一个特殊字符”这样的提示则具有很强的可操作性,而且能清楚地告诉用户应该做什么。

你可以通过以下两种方式来衡量这些指标:首先,要统计有多少错误信息会明确提到具体的字段名称;其次,要了解当用户离开某个输入框时,会有多少错误立即显示出来,而又有多少错误是在用户点击“提交”按钮之后才出现的。

提示信息可以在错误发生之前帮助用户避免失误。你的审计应该验证以下内容:

  • 提示信息的显示位置是否合理(例如,是否在用户开始输入之前就出现?)

  • 提示信息与输入框的视觉间距是否合适

  • 这些提示信息是否可以通过编程方式与相应的输入字段关联起来(比如使用aria-describedby属性)

最后一点尤为重要,因为屏幕阅读器需要通过明确的关联关系来在适当的时候显示提示信息。你可以通过“提示信息显示所需的时间”以及“与 aria-describedby 相关的提示元素数量”等指标来衡量这一点。

键盘操作流程相关的指标也与可访问性密切相关

你的审计应该确认输入字段是否遵循正确的排列顺序。如果 tabindex 的跳转顺序不规律,用户就会迷失方向。

同时,还需要检查当前处于焦点状态的字段是否能够被用户清晰地识别出来。如果焦点位置不明显,用户就很难知道自己应该在哪里操作。

键盘快捷键可以让用户无需使用鼠标即可完成表单的提交、字段内容的清除或页面间的切换。这一点对所有用户来说都很有帮助,而不仅仅是那些使用屏幕阅读器或其他辅助技术的用户。

你可以通过“ tabindex 的排列顺序是否与视觉布局一致”、“焦点指示器的对比度是否合适”,以及“是否存在用于提交、清除内容或导航表单的键盘快捷键”等指标来评估这些方面。

既然你已经明确了适用于正在审核的表单的关键指标和原则,现在就该确定具体需要关注的重点领域了。

如何界定审计范围

你需要明确指定审计将涵盖哪些表单及字段。建议先从小规模开始,逐步建立自动化检测机制,然后再逐步扩大审计范围。

设定初始审计范围

首先应该从应用程序中那些对用户来说至关重要的表单开始审核。下面这个JavaScript代码示例可供参考:将此配置对象粘贴到你的审计自动化工具或脚本中:

const auditScope = {
  signupForm: {
    url: '/signup',
    fields: ['email', 'password', 'confirmPassword'],
    priority: 'critical'
  },
  checkoutForm: {
    url: '/checkout',
    fields: ['cardNumber', 'expiryDate', 'cvv', 'billingZip'],
    priority: 'critical'
  },
  contactForm: {
    url: '/contact',
    fields: ['name', 'email', 'subject', 'message'],
    priority: 'high'
  }
};

在上面的代码中,`auditScope`对象列出了那些至关重要的表单(注册表单、结账表单和联系表单),指定了这些表单的URL地址以及需要检查的关键字段,并标明了它们的优先级。这样审计系统就能知道应该优先处理哪些资源。

“优先级”这一属性使得在系统资源有限的情况下,审计系统能够优先处理那些影响较大的表单。这种做法可以避免因审计范围过于广泛而导致系统负担过重的问题。

制定审计执行计划

你的审计目标决定了审计系统应如何运作。在确定了审计范围之后,你可以将整个审计流程划分为若干个具体的阶段。

  • 第一阶段:通过静态分析来检查HTML文档的结构,验证ARIA属性、标签索引以及用于实现语义功能的标记格式。这样就能发现那些无需用户交互即可发现的结构性问题。

  • 第二阶段:通过动态测试模拟用户的操作流程,从而识别出错误发生的情形、提示信息出现的时机,以及键盘使用者会点击哪些元素。这种方法能够发现那些静态分析无法揭示的运行时问题。

  • 第三阶段:通过视觉验证来检查元素的间距、对比度以及布局位置,这些检查都是基于计算机计算得出的视觉数据进行的。这样就能判断视觉设计是否满足了用户体验或用户界面方面的要求。

每个阶段都会产生与既定审计目标相关的检测结果。如果某个检查项未通过,审计报告会指出是哪项目标导致了这一结果,当前该组件的状态、应达到的目标状态,以及相应的解决建议。

字段级目标

对于每个字段,你都需要告诉脚本或自动化工具,审计实际要检查的内容。每一项检查都对应一项具体的自动化测试。当审计执行时,系统会针对每个字段进行所有这些检查,并记录下出现的错误。

例如,在下面的代码片段中,对于每一个字段(比如“email”或“password”),我们都列出了三类检查项目:错误检查、提示信息检查以及键盘使用规范检查。当你将这个对象关联到你的审计自动化系统中时(比如UI测试框架或无障碍功能检测工具),该系统就会对每个字段执行所有这些测试,并会报告任何测试失败的情况,这样你就能知道输入数据中哪些部分存在问题或缺失。

const fieldObjectives = {
  email: {
    errorChecks: [
      'hasInlineValidation',
      'errorMessageSpecific',
      'showsValidFormatExample'
    ],
    hint Checks: [
      'hintVisibleBeforeInteraction',
      'hintExplainsFormat',
      'hintAccessible'
    ],
    keyboardChecks: [
      'tabOrderCorrect',
      'focusVisible',
      'supportsAutocomplete'
    ]
  },
  password: {
    errorChecks: [
      'hasInlineValidation',
      'listsAllRequirements',
      'showsProgressIndicator'
    ],
    hint Checks: [
      'hintListsRequirements',
      'hintVisibleBeforeTyping',
      'hintPersistsDuringTyping'
    ],
    keyboardChecks: [
      'tabOrderCorrect',
      'focusVisible',
      'supportsPasswordManagers'
    ]
  }
};

这样的设计能够确保对用户输入的关键部分进行非常细致、一致且可重复的测试,从而有效验证表单的可用性、无障碍功能以及数据的正确性。

将目标与业务关键指标关联起来

审计结果应当与业务影响直接挂钩。让我们看看这些目标是如何与关键绩效指标相对应起来的。

对于转化率而言,这种影响应该是直接且具体的。例如,改进错误提示信息会直接影响表单的完成率:

  • 基准值:当前表单的弃用率。

  • 目标:由于错误提示信息更加清晰,使弃用率降低15%。

  • 审计验证标准:100%的错误提示信息都必须清晰且具体。

减少支持请求的数量也是另一个重要目标。在这种情况下,更完善的提示信息能有效避免用户的困惑:

  • 基准值:目前与表单相关的支持请求数量。

  • 目标:将支持请求的数量减少25%。

  • 审计验证标准:100%的复杂字段都应配有主动提示信息。

遵守无障碍设计规范也是另一个重要目标。键盘导航功能直接关系到法律合规性,同时也能帮助吸引更多用户使用该系统。这里可以举一些具体的关键绩效指标作为例子:

  • 基准水平:当前符合WCAG标准的程度。

  • 目标:所有表单都必须达到WCAG 2.1 AA标准。

  • 审核验证:100%的字段仅通过键盘操作即可使用。

在制定了这些可量化的成功标准之后,你应该将这些标准作为系统的阈值。以下是一个示例,说明了如何为自动化审核设定通过与未通过的判定标准:

const auditThresholds = {
  errorMessages: {
    specificityScore: 0.9,  // 90%的错误信息必须包含特定于该字段的详细内容
    inlineValidationPercentage: 1.0,  // 100%的内容都必须显示内联错误提示
    actionabilityScore: 0.85  // 85%的错误信息必须提供修复指导
  },
 hints: {
    proactiveDisplayPercentage: 1.0,  // 100%的提示信息必须在用户开始输入之前显示
    proximityMaxPixels: 8,  // 提示信息必须距离相关字段不超过8像素
    ariaAssociationPercentage: 1.0  // 100%的元素都必须具有aria-describedby属性
  },
  keyboardFlow: {
    tabOrderCorrectnessScore: 1.0,  // 100%的标签顺序必须与视觉布局一致
    focusContrastRatio: 3.0,  // 聚焦提示的对比度最低应为3:1
    shortcutCoveragePercentage: 0.8  // 80%的操作都必须有快捷键
  }
};

如你所见,在“errorMessages”部分,0.9的具体性得分意味着90%的错误信息必须包含针对具体字段的详细内容。而在“hints”设置中,1.0的“proactiveDisplayPercentage”要求提示信息必须在用户开始输入之前显示,这样才能使测试通过。

审计文档编制的5C框架

在记录审核结果时,使用5C框架可以确保你的报告具有实际意义:

  • 覆盖范围:你测试了哪些表单和字段?请明确说明测试的范围。

  • 完整性:你是否完成了所有计划中的检查?如果省略了某些检查,请说明原因。

  • 一致性: 所有的结果是否都采用相同的格式和术语进行表述?这样报告会更容易阅读。

  • 清晰性:开发人员能否通过失败报告清楚地知道需要修复什么问题?请提供当前状态、预期状态以及代码示例。

  • 准确性:你的检查是否真的在检测正确的内容?要确保失败原因与用户实际遇到的问题相符,而不仅仅是技术上的违规行为。

这个框架有助于设计师和开发人员快速理解审核结果并采取相应行动。

如何结合启发式评估与定量数据

一旦确定了目标,你就应该根据可用性原则以及用户的行为模式来进行审核。将经过验证的可用性启发式方法与定量数据相结合,可以帮助你确认自动化检查确实能够发现用户实际遇到的问题,而不仅仅是假设性的极端情况(来源:Jakob Nielsen, NNgroup)。

实现这一目标的最佳方法是,将这些问题与《Web内容无障碍指南》中的通用标准相对应起来,并以此作为审计工作的依据(来源:WCAG 2.1,W3C推荐标准)。对于每一个被识别出的问题,都需要确定该问题违反了哪一条WCAG标准。这样,你就能得到明确的检查要求,这些要求可以用于自动化检测流程,而且所有参与审计工作的人员都应该能够理解这些要求。

const wcagMapping = {
  errorIdentification: {
    criterion: '3.3.1',
    level: 'A',
    requirement: '错误信息必须指出出现问题的具体字段',
    testFunction: 'checkErrorIdentification'
  },
  errorSuggestion: {
    criterion: '3.3.3',
    level: 'AA',
    requirement: '错误信息必须提供改正建议',
    testFunction: 'checkErrorSuggestions'
  },
  labelInName: {
    criterion: '2.5.3',
    level: 'A',
    requirement: '可访问的名称中必须包含可见的标签文本',
    testFunction: 'checkLabelInName'
  },
  focusOrder: {
    criterion: '2.4.3',
    level: 'A',
    requirement: '元素的聚焦顺序必须保证其功能能够被正确使用',
    testFunction: 'checkFocusOrder'
  }
};

如果表格的某部分违反了WCAG 3.3.1标准——比如在显示错误信息时没有指明出问题的具体字段——你的审计报告可以这样记录这一情况:

“电子邮件字段中显示的错误信息是‘输入无效’,但并没有说明该字段哪项要求没有达到。根据WCAG 3.3.1标准,错误信息必须指出出现问题的具体字段(可行的修改方案:‘电子邮件地址中必须包含@符号’)。所违反的标准就是3.3.1。”

Nielsen提出的可用性评估方法可以告诉你什么是良好的用户体验,但像Google Analytics和Hotjar这样的工具则能展示用户在实际使用你的表格时的行为。将这两种方法结合起来——既考虑可用性原则,又分析真实用户的操作数据——你就能更准确地判断哪些问题需要优先解决。

Souza等人,IEEE Access)。因此,你应该利用这两种类型的数据来确定自动化审计应该检查哪些内容。

定义二元通过/失败标准

自动化检测需要明确的结果。你的审计报告必须清楚地说明某个组件是符合WCAG标准的还是不符合的。整个检测过程必须产生二元结果——即“是”或“否”,“合格”或“不合格”。

例如,以下代码实现了一个明确的、二元的检测机制,用于判断某个表格字段是否满足WCAG 3.3.1标准中关于错误信息显示的要求(来源:WCAG 2.1,W3C推荐标准):

function checkErrorIdentification(field) {
  const errorElement = field.querySelector('[role="alert"], .error-message');
  
  if (!errorElement) {
    return {
      pass: false,
      wcag: '3.3.1',
      severity: 'critical',
      message: `字段“${field.name}”缺少错误提示元素`,
      fix: '添加 aria-describedby 属性,使其指向错误提示容器`
    };
  }
  
  const errorText = errorElement.textContent.trim();
  const hasFieldReference = errorText.toLowerCase().includes(field.name.toLowerCase()) 
    || errorText.toLowerCase().includes(field.labels[0]?.textContent.toLowerCase());
  
  if (!hasFieldReference) {
    return {
      pass: false,
      wcag: '3.3.1',
      severity: 'major',
      message: `错误提示信息“${errorText}”没有指明对应的字段`,
      fix: `在错误提示信息中包含字段名称:`\({field.labels[0]?.textContent} \){errorText}``
    };
  }
  
  return { pass: true, wcag: '3.3.1' };
}

错误信息会明确指出具体存在的问题,而且每个组件都会被明确地判定为通过或未通过相关标准。因此,不存在任何需要解释或产生疑问的地方。

规范错误信息与提示信息

请记住,自动化功能要求使用方式的一致性。你可以创建一些集中式的资源库,其中收录各种被认可的使用模式及相应的审批结果,开发人员可以参考这些资源库;同时,你的测试系统也可以检查你的表单是否使用了规范化的信息。

例如,在下面的代码片段中,`errorLibrary`对象为应用程序中针对特定字段会显示的所有错误信息提供了统一的来源。对于每个字段,都有一些针对常见验证问题的、定义明确的提示信息。同样地,`hintLibrary`对象也为用户输入前显示的提示文本提供了统一的来源。

const errorLibrary = {
  email: {
    empty: '需要填写电子邮件地址',
    invalid: '电子邮件必须包含@符号和域名(例如:user@domain.com)',
    duplicate: '该电子邮件已经注册。请尝试登录。'
  },
  password: {
    empty: '需要设置密码',
    tooShort: '密码长度必须至少为8个字符',
    missingUppercase: '密码中必须至少包含一个大写字母',
    missingNumber: '密码中必须至少包含一个数字',
    missingSpecial: '密码中必须至少包含一个特殊字符(!@#$%^&*)'
  }
};

const hintLibrary = {
  email: '请输入您的电子邮件地址(例如:name@company.com)',
  password: '请设置一个长度为8个以上字符的密码,其中必须包含大写字母、数字和特殊字符',
  phone: '请输入10位数字的电话号码,不要使用破折号(例如:5551234567)'
};

通过使用这些统一的格式规范,就可以避免在应用程序的不同部分出现重复或不一致的提示信息,从而提高代码的可维护性。

使用明确的ARIA标识符

如果你使用统一规范的ARIA属性,就可以实现自动化的检查。例如,在下面的代码片段中,我们明确指定了哪些ARIA属性用于关联错误信息、提示文本和相应的输入字段。`auditARIAImplementation`函数会检查每个字段是否具有可访问的标签(无论是HTML元素还是`aria-label`属性),以确保符合WCAG 1.3.1的标准。如果没有这样的标签,用户就很难理解该输入字段的用途。

function auditARIAImplementation(field) {
  const checks = {
    hasLabel: !!field.labels?.length || !!field.getAttribute('aria-label'),
    hasDescription: !!field.getAttribute('aria-describedby'),
    hasErrorMessage: !!field.getAttribute('aria-errormessage'),
    hasRequired: field.hasAttribute('required') || field.getAttribute('aria-required') === 'true'
  };

  const failures = [];

  if (!checks.hasLabel) {
    failures.push({
      wcag: '1.3.1',
      message: `字段 "${field.name}"缺少可访问的标签`,
      fix: '添加

此功能会检查您的设计系统所规定的特定 ARIA 标签相关规则。值得称赞的是,您可以通过 CI/CD 流程来检测代码,从而确保各项实现标准得到遵守。

接下来的内容将帮助您针对错误、提示信息以及键盘操作流程,制定具体的自动化测试用例。

如何为表单组件定义自动化测试用例

现在,既然您已经根据 WCAG 标准、启发式规则以及用户数据建立了基准,那么就可以创建具体的自动化测试用例了。每个测试用例都会针对表单组件的错误信息、提示文本或键盘导航功能,来检测其是否满足相应的质量要求。后续章节会提供具体方法,帮助您为每个表单组件实现这些自动化检查。

自动化错误信息检测

错误信息在用户交互过程中起着至关重要的作用。您的自动化检测系统必须确保每条错误信息都符合具体性、呈现时机以及可操作性这三项标准。每条错误信息都必须清楚地说明究竟出现了什么问题;那些笼统模糊的错误信息是不符合这些要求的。

在自动化检测中,可以进一步判断错误信息是否指出了字段的具体问题所在。例如,在下面的代码片段中,该程序会验证表单中出现的每一条错误信息是否能够准确指出输入错误的原因,而不会使用含糊不清的通用表述。

function auditErrorSpecificity(formId) {
  const form = document.getElementById(formId);
  const fields = form.querySelectorAll('input, textarea, select');
  const failures = [];
  
  fields.forEach(field => {
    const errorElement = document.querySelector(`[aria-describedby="${field.id}-error"]`);
    if (errorElement) {
      const errorText = errorElement.textContent.toLowerCase();
      const genericTerms = ['invalid', 'error', 'wrong', 'incorrect'];
      const isGeneric = genericTerms.some(term =&to>
        errorText.includes(term) && errorText.split(' ').length < 4
      );
      
      if (isGeneric) {
        failures.push({
          field: field.id,
          message: errorText,
          issue: '通用错误信息缺乏具体性',
          wcag: '3.3.1 错误识别'
        });
      }
    }
  });
  
  return failures;
}

该代码会检查那些使用笼统通用词汇来描述错误的消息,因为这类模糊不清的信息并不符合 WCAG 3.3.1 的要求——它们无法为用户提供可行的错误修正建议(来源:WCAG 3.3.1, WC3)。

内联错误信息的显示时机

错误信息应该在用户离开相关字段时立即显示,而不仅仅是在提交表单时才出现。研究表明,即使只是反馈信息的呈现时机不当,也会显著影响用户的操作体验。您的自动化检测系统应该检查错误信息是否能够及时在内联位置显示出来(来源:Al-Khalifa 等人,ResearchGate)。

这段代码用于验证:当用户离开那些要求输入内容的字段时,错误信息是否会立即显示出来,而不是等到用户提交整个表单后才显示错误。

function auditErrorTiming(formId) {
  const form = document.getElementById(formId);
  const fields = form.querySelectorAll('input[required], textarea[required}`);
  const failures = [];
  
  fields.forEach(field => {
    let hasBlurValidation = false;
    let hasInputValidation = false;
    
    // 检查是否设置了blur事件监听器
    const blurListeners = getEventListeners(field).blur || [];
    hasBlurValidation = blurListeners.length > 0;
    
    // 检查是否设置了input事件监听器
    const inputListeners = getEventListeners(field).input || [];
    hasInputValidation = inputListeners.length > 0;
    
    if (!hasBlurValidation && !hasInputValidation) {
      failures.push({
        field: field.id,
        issue: '没有设置内联验证机制',
        recommendation: '应为blur和input事件添加验证逻辑',
        wcag: '3.3.1 错误识别'
      });
    }
  });
  
  return failures;
}

这项审计旨在确认:对于那些需要输入内容的字段,是否为blur事件和input事件设置了相应的事件处理程序;同时也会检查那些没有设置这些验证机制的情况,并根据WCAG 3.3.1标准将其视为缺陷(来源:WCAG 3.3.1, WC3)。

确认可行的恢复指导措施

错误信息必须明确说明用户应该如何解决出现的各种问题。例如,当系统提示“密码太弱”时,用户可能会感到困惑;而如果错误信息是“密码长度必须为8个以上字符,且至少包含1个大写字母和1个数字”,那么就能为用户提供足够的指导,帮助他们进行正确的修改。

我们来看一个示例:这段代码用于审核密码字段,确保错误信息中包含了具体的、可操作的恢复提示,明确指出用户应该调整哪些内容,以及如何纠正输入错误(来源:WCAG 3.3.3, WC3)。

function auditErrorActionability(formId) {
  const form = document.getElementById(formId);
  const failures = [];
  const passwordFields = form.querySelectorAll('input[type="password"];
  
  passwordFields.forEach(field => {
    const errorElement = document.getElementById(`${field.id}-error`);
    if (errorElement) {
      const errorText = errorElement.textContent;
      const hasSpecificRequirements = /\d+/.test(errorText) || 
        /uppercase|lowercase|special|character|digit/.test(errorText.toLowerCase());
      
      if (!hasSpecificRequirements) {
        failures.push({
          field: field.id,
          message: errorText,
          issue: '错误信息缺乏具体的恢复指导',
          wcag: '3.3.3 错误提示'
        });
      }
    }
  });
  
  return failures;
}

如果错误信息中不包含这些字符,或者长度不符合要求,该函数就会将相关实例标记为失败,并附上相应的WCAG参考条款。

自动化的丰富提示文本审核

丰富的提示文本有助于避免错误的发生(从而减少出现错误信息的需求)。研究表明,当用户获得主动性的指导时,填写表单的效率可以提高23%(来源:Okonkwo, ResearchGate)。你的自动化系统应当确保正确的提示文本在适当的时间、出现在合适的位置,并且以易于访问的方式呈现出来。

该功能会审核表单字段,以确保用户在开始操作表单之前就能看到这些提示文本,从而帮助避免填写表单时出现错误。

function auditHintTiming(formId) {
  const form = document.getElementById(formId);
  const complexFields = form.querySelectorAll('input[type="password"], input[pattern]++;
  const failures = [];
  
  complexFields.forEach(field => {
    const hintElement = document.querySelector(`[id="${field.getAttribute('aria-describedby')}"]`);
    
    if (!hintElement) {
      failures.push({
        field: field.id,
        issue: '复杂字段缺少主动提示文本',
        wcag: '3.3.2 标签或说明'
      });
    } else {
      // 检查在用户进行操作之前提示文本是否可见
      const computedStyle = window.getComputedStyle(hintElement);
      const isVisible = computedStyle.display !== 'none' && computedStyle.visibility !== 'hidden';
      
      if (!isVisible) {
        failures.push({
          field: field.id,
          issue: '提示文本在用户操作前被隐藏',
          wcag: '3.3.2 标签或说明'
        });
      }
    }
  });
  
  return failures;
}

如果提示文本不存在,或者直到用户在表单中进行了操作之后才显示出来,那么该函数就会将其标记为不符合WCAG 3.3.2标准中的“标签或说明”要求,因为这会导致表单设计缺乏一致性且不够用户友好(来源:WCAG 3.3.3, WC3)。

如何确保键盘导航流程的一致性

为了符合WCAG标准,必须保证键盘可访问性,而大多数测试都可以通过代码自动完成。如果用户无法仅使用键盘来操作你的表单,他们往往会放弃并离开页面,而这会直接影响你的转化率。

当你详细规定了键盘导航应如何进行时,就可以编写自动化测试来验证这些规定是否真正得到了落实。

梳理交互流程

你的审核工作应当记录每个组件预期的键盘交互行为。例如,对于弹出对话框来说,需要明确“Tab”键会依次切换对话框内的元素,“Escape”键会关闭对话框,而焦点会返回到打开对话框的元素上。

对于表单而言,请注意:按“Tab”键会按照视觉布局的顺序依次切换字段;按“Shift+Tab”键则会倒序切换;而只有通过提交按钮按下“Enter”键,表单才会被真正提交。

你应该以数据驱动的方式记录这些操作流程。使用一种结构化的格式,为每个操作设置“组件”、“按键操作”、“预期结果”以及“相关的WCAG规范”等字段,这样既便于人工审核,也方便自动化解析:

const keyboardPatterns = {
  'modal-dialog': {
    tab: '将焦点移至模态框内的下一个元素',
    shiftTab: '将焦点移至模态框内的上一个元素',
    escape: '关闭模态框并恢复默认焦点',
    wcag: '2.1.1 键盘使用, 2.4.3 焦点顺序'
  },
  'form-field': {
    tab: '按视觉布局顺序跳转到下一个字段',
    shiftTab: '按视觉布局顺序跳回到上一个字段',
    enter: '仅通过提交按钮提交表单',
    wcag: '2.1.1 键盘使用, 2.4.3 焦点顺序'
  },
  'dropdown-select': {
    space: '打开下拉菜单',
    arrowDown: '跳转到下一个选项',
    arrowUp: '跳回到上一个选项',
    enter: '选择当前选项',
    escape: '不进行选择直接关闭下拉菜单',
    wcag: '2.1.1 键盘使用, 4.1.2 名称、角色、值'
  }
};

这段代码将这些操作模式与WCAG规范中的2.1.1(键盘可访问性)、2.4.3(焦点顺序)以及4.1.2(名称、角色、值)要求相一致,从而为那些依赖键盘进行操作的用户提供便利(来源:WCAG规范解读文档, WC3)。

自动化的Tab键顺序验证

Tab键的切换顺序应与页面的视觉布局保持一致。如果焦点随机跳转,用户就会感到困惑。下面的代码会检查焦点是否按照人们预期的顺序(从上到下、从左到右)在各个字段之间移动;即使tabIndex的值看起来没有问题,该代码也能发现那些焦点跳转顺序异常的情况。

function auditTabOrder(formId) {
  const form = document.getElementById(formId);
  const focusableElements = form.querySelectorAll(
    'input, select, textarea, button, a[href], [tabindex]:not([tabindex="-1."]'
  );
  const failures = [];
  
  const elements = Array.from(focusableElements).map(el => ({
    element: el,
    position: el.getBoundingClientRect(),
    tabindex: parseInt(el.getAttribute('tabindex')) || 0
  }));
  
  for (let i = 1; i < elements.length; i++) {
    const prev = elements[i - 1];
    const curr = elements[i];
    
    // 检查Tab键的切换顺序是否与视觉布局一致
    const visuallyBefore = prev.position.top < curr.position.top || 
      (prev.position.top === curr.position.top && prev.position.left < curr.position.left);
    
    if (!visuallyBefore && prev.tabindex === curr.tabindex) {
      failures.push({
        field: curr.element.id,
        issue: 'Tab键的切换顺序与视觉布局不一致',
        wcag: '2.4.3 焦点顺序'
      });
    }
  }
  
  return failures;
}

本质上,这个验证功能能够检测出那些不符合WCAG 2.4.3规范中关于焦点顺序要求的情况,同时还能确保用户在使用表单字段时能够保持操作逻辑的连贯性(来源:WCAG 2.4.3规范, WC3)。

验证焦点可见性

焦点指示器必须能够被清晰地识别出来。根据研究,可视的焦点指示器能够显著提升打字效率并减少错误(来源:刘等人的研究,ResearchGate)。

例如,焦点指示器的样式可以包括轮廓线、边框或阴影,但这些元素与背景之间的对比度必须足够高(至少为3:1),才能满足WCAG 2.4.7“焦点可见性”标准以及1.4.11“非文本元素的对比度”要求(来源:WCAG规范说明,WC3)。请看以下示例:

function auditFocusVisibility(formId) {
  const form = document.getElementById(formId);
  const focusableElements = form.querySelectorAll('input, select, textarea, button');
  const failures = [];
  
  focusableElements.forEach(element => {
    element.focus();
    const computedStyle = window.getComputedStyle(element);
    
    // 检查焦点指示器是否可见
    const hasOutline = computedStyle.outline !== 'none' && 
      computedStyle.outlineWidth !== '0px';
    const hasBorder = computedStyle.borderStyle !== 'none';
    const hasBoxShadow = computedStyle.boxShadow !== 'none';
    
    // 检查焦点指示器的对比度
    const outlineColor = computedStyle.outlineColor;
    const backgroundColor = computedStyle.backgroundColor;
    const contrastRatio = calculateContrastRatio(outlineColor, backgroundColor);
    
    if (!hasOutline && !hasBorder && !hasBoxShadow) {
      failures.push({
        field: element.id,
        issue: '没有可见的焦点指示器',
        wcag: '2.4.7 焦点可见性'
      });
    } else if (contrastRatio < 3) {
      failures.push({
        field: element.id,
        contrastRatio: contrastRatio.toFixed(2),
        issue: '焦点指示器的对比度低于3:1',
        wcag: '1.4.11 非文本元素的对比度'
      });
    }
  });
  
  return failures;
}

良好的焦点样式设置有助于键盘用户明确自己当前位于页面的哪个位置。这段代码用于检查焦点指示器是否可见,以及它们与背景之间的对比度是否足够高,从而使用户能够清楚地知道自己正在操作哪个输入字段。

使用自动化测试工具

为了进一步提高审核工作的效率,你可以使用诸如Google Lighthouseaxe-core以及Cypress这样的工具。你还可以将这些工具结合起来使用,从而获得更强大的测试效果——例如,将axe-core与Cypress结合使用,是我能推荐的最全面的测试方案。

以下是您可以遵循的工作流程:

async function runAccessibilityAudit(formId) {
  const form = document.getElementById(formId);
  const results = await axe.run(form, {
    rules: {
      'label': { enabled: true },
      'aria-required-attr': { enabled: true },
      'aria-valid-attr-value': { enabled: true },
      'keyboard-navigation': { enabled: true },
      'focus-order-semantics': { enabled: true }
    }
  });
  
  const violations = results.violations.map(violation => ({
    rule: violation.id,
    impact: violation.impact,
    description: violation.description,
    wcag: violation.tags.filter(tag => tag.startsWith('wcag')),
    elements: violation.nodes.map(node => node.target)
  }));
  
  return violations;
}

当您记录键盘操作模式并自动化检查流程时,就能确保所有人都能顺利填写表格——无论他们是使用鼠标、键盘还是屏幕阅读器。在您的持续集成/持续交付管道中执行这些检查,可以在问题实际发生之前及时发现它们。

基于人工智能的导航模式检测

机器学习模型能够帮助识别那些异常的键盘操作序列,这些序列往往预示着潜在的使用体验问题。将鼠标追踪技术与人工智能相结合,能够让您深入了解用户行为,而这些是传统方法无法实现的(参考资料:Souza等人,IEEE Access)。

这种逻辑同样可以应用于键盘操作研究。因为人工智能模型可以通过学习典型的成功导航模式来判断用户在使用键盘时是否遇到了困难。

利用人工智能进行导航模式检测

人工智能工具能够评估用户的键盘操作行为,在测试过程中发现不符合规范的操作。例如,通过机器学习技术,下面的代码示例可以捕捉、分析并分类网页表单上异常或存在问题的键盘操作行为,从而识别出那些可能表明存在使用体验问题的独特键盘操作序列。

async function detectNavigationAnomalies(formId) {
  const navigationData = captureKeyboardSequence(formId);
  const features = extractNavigationFeatures(navigationData);
  
  // 使用机器学习对导航模式进行分类
  const model = await loadTrainedModel('keyboard-anomaly-detection');
  const predictions = await model.predict(features);
  
  const anomalies = predictions.filter(p => p.confidence > 0.8).map(p => ({
    sequence: p.keystrokes,
    anomalyType: p.classification,
    severity: p.confidence,
    recommendation: generateRecommendation(p.classification)
  }));
  
  return anomalies;
}

function extractNavigationFeatures(data) {
  return {
    tabSequenceLength: datatabs.length,
    backtrackCount: countBacktracks(data.tabs),
    focusTrapIndicators: detectFocusTraps(data),
    averageTimePerElement: calculateAverageTime(data),
    sequenceDeviation: measureSequenceDeviation(data)
  };
}

该代码结构通过`captureKeyboardSequence(formId)`来捕捉用户在指定表单上进行的键盘操作,这意味着用户实际上输入了诸如使用Tab键切换字段或聚焦到特定字段之类的操作。

通过使用`extractNavigationFeatures(data)`,代码会对原始的键盘操作序列进行处理,并计算相应的指标。最后,代码会加载一个预先训练好的机器学习模型,将提取出的特征传递给该模型,使其能够将这些特征分类到相应的类别中,并同时生成置信度分数。

任何置信度分数达到0.8或更高的异常键盘操作都会被过滤掉。检测到的按键序列、异常类型、严重程度以及具体的处理建议都会被包含在最终的结果报告中,供用户后续查阅。

用于导航性能评分的模糊逻辑范式

协作反馈系统有助于提升虚拟键盘的使用体验。模糊逻辑允许我们将多种评估指标——比如字段的可见性以及Tab键的切换顺序——结合成一个综合分数,这个分数能更准确地反映用户的实际使用体验。(来源:Liu等人,ResearchGate)。

例如,以下代码创建了一个模糊推理系统,该系统会评估两个输入参数:字段的可见性以及Tab键的切换逻辑。这两个输入参数会通过模糊逻辑及相应的规则进行综合分析,从而得出一个代表特定应用程序中键盘操作效率的综合分数。

function createKeyboardNavigationFuzzySystem() {
  // 定义模糊变量
  const focusVisibility = new FuzzyVariable('focusVisibility', 0, 100);
  focusVisibility.addTerm('poor', new TriangularMF(0, 0, 40));
  focusVisibility.addTerm('adequate', new TriangularMF(30, 50, 70));
  focusVisibility.addTerm('excellent', new TriangularMF(60, 100, 100));
  
  const tabOrderLogic = new FuzzyVariable('tabOrderLogic', 0, 100);
  tabOrderLogic.addTerm('confusing', new TriangularMF(0, 0, 40));
  tabOrderLogic.addTerm('acceptable', new TriangularMF(30, 50, 70));
  tabOrderLogic.addTerm('intuitive', new TriangularMF(60, 100, 100));
  
  const navigationEfficiency = new FuzzyVariable('navigationEfficiency', 0, 100);
  navigationEfficiency.addTerm('inefficient', new TriangularMF(0, 0, 40));
  navigationEfficiency.addTerm('moderate', new TriangularMF(30, 50, 70));
  navigationEfficiency.addTerm('efficient', new TriangularMF(60, 100, 100));
  
  // 定义模糊规则
  const rules = [
    'IF focusVisibility IS excellent AND tabOrderLogic IS intuitive THEN navigationEfficiency IS efficient',
    'IF focusVisibility IS poor OR tabOrderLogic IS confusing THEN navigationEfficiency IS inefficient',
    'IF focusVisibility IS adequate AND tabOrderLogic IS acceptable THEN navigationEfficiency IS moderate'
  ];
  
  return new FuzzyInferenceSystem([focusVisibility, tabOrderLogic], navigationEfficiency, rules);
}

这种评分方法旨在比其他现有的用户满意度评估方式更能真实反映用户使用键盘导航系统的体验。该模糊推理系统会同时从多个维度来评估键盘导航的质量,因此其生成的评分范围与用户报告的满意度数值大致相当(来源:刘等人的研究,ResearchGate网站)。

结论

本文为你提供了进行应用程序表单用户体验审计所需的各种工具和资源,帮助你从初始设置开始,逐步实现持续集成过程中的自动化检测流程。

你已经掌握了以下内容:

  • 表单的三个核心组成部分,以及系统地处理这些组成部分的重要性。

  • 如何将具体目标直接与业务关键绩效指标及用户实际体验联系起来。

  • 如何设置自动化测试机制,以便准确检测错误类型、确定验证时机,并明确在出现错误后应采取的下一步行动方向。

  • 如何优化表单中的提示信息:确保这些提示信息能够主动显示出来、距离它们所要辅助填写的字段足够近,同时还要保证其易被用户理解。

  • 如何通过检查标签顺序、测试焦点是否可见以及使用ARIA标签来验证键盘导航功能的合理性。

  • 如何将WCAG标准及尼尔森提出的10条可用性启发式原则融入自动化测试流程中。

  • 如何利用“5C”原则(覆盖范围、完整性、一致性、清晰度、正确性)来准备设计团队与开发团队之间的交接文档。

后续步骤:

  • 先从应用程序中某个影响较大的表单开始,比如注册表单或结账页面,然后对其中的错误信息及键盘导航流程进行基本的自动化检测。

  • 将一两个审计功能集成到现有的测试套件中,看看它们能否帮助你发现那些手动测试时可能忽略的问题。

  • 为最重要的表单创建一个集中的错误提示信息库,以确保这些提示信息的一致性。

  • 随着自动化检测技术的不断完善,逐步将审计范围扩展到更多的表单和字段上。

  • 将这些检测流程加入你的持续集成/持续交付管道中,确保每次提交代码时都能自动进行这些测试,从而及时发现潜在的问题。

  • 当基础性的审计工作稳定后,可以尝试利用人工智能技术来检测键盘导航过程中出现的异常情况。

最重要的是,请记住:表单用户体验的优化是一个需要持续进行的工作,而不是一次性完成的任务。首先从那些直接影响转化率的表单开始入手,确保自动化检测机制能够真正发现用户遇到的问题,然后逐步扩大检测范围。你的目标应该是建立一个可靠的系统,不断帮助用户避免使用过程中遇到的各种障碍。

关于作者

希望您喜欢这篇文章,并觉得它对您有所帮助。我在freeCodeCamp平台上持续贡献内容已有8年之久,为了使这篇文章更加准确、详尽,我还请教了一些专家的帮助。

我衷心感谢COAX Software中那些经验丰富的设计师们提供的用户体验与无障碍设计方面的指导,同时也非常感谢那些提供了自动化代码片段的专业开发者们(他们都希望保持匿名)。这家公司在UI/UX设计领域拥有深厚的专业实力。

如果您想了解更多关于我的信息,或阅读更多与科技、数字相关的内容,请访问https://www.linkedin.com/in/oleg-romanyuk/

Comments are closed.