在 Geb 中检查只读

Checking for readonly in Geb

我正尝试在 Geb 中编写一个测试,其中包含大量不同的文本字段。该场景本质上是有五个或六个 html 输入,并且一次只能允许用户输入其中一个。也就是说,如果第一个文本框有值,则其余文本框应该是不可变的。

而不是具有输入类型="disabled" 的元素,它们具有只读属性(我假设它是一个属性?)。

这是一个通用示例:

<input aria-labelledby="Date Input Value 1" id="Date Input 1" name="Date Input 1" class="input-small DateOrEmpty dateInput" value="" style="display: inline-block;" readonly="">

我试过了

${"input", id: "Date Input 1"}.@readonly 

以及

${"input", id: "Date Input 1"}.has("readonly")

而且我运气不太好..

你这里有几个问题:

  • 您使用 HTML 带有行内空格的 ID。这实际上不是合法的名称,并且使编写简单的 CSS 选择器变得更加困难,例如 #my-id
  • 选择器的 Geb 语法使用圆括号,而不是大括号。花括号用于闭包,这是一种完全不同的野兽。
  • 请注意,根据 HTML specificationreadonly 属性是布尔值,如果它存在则始终为真,即通常您不写 readonly="something" 而只写 readonly.即使你写 readonly="false" 它也会评估为真,因为它的值被忽略,只检查它的存在。

因此,如果您有此 HTML 代码:

<input id="Date Input 1" readonly>
<input id="Date Input 2">
<input id="date-input-3" readonly="false">
<input id="date-input-4">
<input id="date-input-5" readonly="">

您可以在 Geb 测试中编写这些选择器(请注意在 ID 中不使用空格如何使选择器更简单):

$("input[id='Date Input 1']").@readonly
!$("input[id='Date Input 2']").@readonly
$("input#date-input-3").@readonly
!$("input#date-input-4").@readonly
$("input#date-input-5").@readonly

不必处理这样一个事实,即使是空的 readonly 属性也会导致元素为只读,但 $("input[id='Date Input 1']").@readonly 的计算结果为 falsey 值(如 @readonly returns 属性的值,在您的情况下为空字符串)为什么不将导航器变成 FormElement module 的实例并使用 isReadOnly() 属性它提供的方法?

$("input[id='Date Input 1']").module(FormElement).readOnly

编辑 正如 kriegaex 所指出的,$("input[id='Date Input 1']").@readonly 实际上评估为 truthy 值(因为 WebDriver 在获取值时总是 returns 包含 true 的字符串readonly 属性,只要该属性是在元素上定义的,而不考虑该属性的实际值)。

以上意思是:

$("input[id='Date Input 1']").module(FormElement).readOnly

和:

$("input[id='Date Input 1']").@readonly

是等效的,因为它们的计算结果为 真实 值。