在 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 specification,
readonly
属性是布尔值,如果它存在则始终为真,即通常您不写 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
是等效的,因为它们的计算结果为 真实 值。
我正尝试在 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 specification,
readonly
属性是布尔值,如果它存在则始终为真,即通常您不写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
是等效的,因为它们的计算结果为 真实 值。