Groovy 在Geb中检查只读

Groovy 在Geb中检查只读,groovy,automation,automated-tests,spock,geb,Groovy,Automation,Automated Tests,Spock,Geb,我正在尝试用Geb编写一个测试,它有一系列不同的文本字段。该场景本质上是有五到六个html输入,用户一次只能输入其中一个。也就是说,如果第一个文本框有一个值,那么其余的文本框应该是不可变的 元素没有输入type=“disabled”,而是有一个readonly属性(我假设它是一个属性?) 以下是一个通用示例: <input aria-labelledby="Date Input Value 1" id="Date Input 1" name="Date Input 1" class="in

我正在尝试用Geb编写一个测试,它有一系列不同的文本字段。该场景本质上是有五到六个html输入,用户一次只能输入其中一个。也就是说,如果第一个文本框有一个值,那么其余的文本框应该是不可变的

元素没有输入type=“disabled”,而是有一个readonly属性(我假设它是一个属性?)

以下是一个通用示例:

<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"}.has("readonly")

而且我运气不太好。

这里有几个问题:

  • 将HTML ID与内联空格一起使用。这实际上不是合法的名称,因此更难为它们编写简单的CSS选择器,如
    #my id
  • 选择器的Geb语法使用括号,而不是大括号。花括号用于闭包,这是一种完全不同的野兽
  • 请注意,根据
    readonly
    属性,如果它存在,则该属性为布尔值且始终为真,即通常您不编写
    readonly=“something”
    ,而只编写
    readonly
    。即使您写入
    readonly=“false”
    它也将计算为true,因为它的值被忽略,只检查它的存在性
因此,如果您有以下HTML代码:


您可以在Geb测试中写入这些选择器(请注意,在IDs中不使用空格会使选择器更简单):

$(“输入[id='Date input 1'])。@readonly
!$(“输入[id=”日期输入2'])。@只读
$(“输入#日期输入-3”)。@readonly
!$(“输入#日期输入-4”)@readonly
$(“输入#日期输入-5”)。@readonly

这里有几个问题:

  • 将HTML ID与内联空格一起使用。这实际上不是合法的名称,因此更难为它们编写简单的CSS选择器,如
    #my id
  • 选择器的Geb语法使用括号,而不是大括号。花括号用于闭包,这是一种完全不同的野兽
  • 请注意,根据
    readonly
    属性,如果它存在,则该属性为布尔值且始终为真,即通常您不编写
    readonly=“something”
    ,而只编写
    readonly
    。即使您写入
    readonly=“false”
    它也将计算为true,因为它的值被忽略,只检查它的存在性
因此,如果您有以下HTML代码:


您可以在Geb测试中写入这些选择器(请注意,在IDs中不使用空格会使选择器更简单):

$(“输入[id='Date input 1'])。@readonly
!$(“输入[id=”日期输入2'])。@只读
$(“输入#日期输入-3”)。@readonly
!$(“输入#日期输入-4”)@readonly
$(“输入#日期输入-5”)。@readonly

而不必处理这样一个事实,即即使是空的
只读
属性也会导致元素为只读,但
$(“输入[id='Date input 1'])。@readonly
的计算结果为假值(因为
@readonly
返回的属性值在您的情况下是空字符串)为什么不将导航器转换为的实例并使用它提供的
isReadOnly()
属性方法

$("input[id='Date Input 1']").module(FormElement).readOnly
编辑 正如kriegaex所指出的,
$(“输入[id='Date input 1'])。@readonly
实际计算结果为真实值(因为WebDriver在获取
readonly
属性的值时总是返回一个包含
true
的字符串,只要该属性在元素上定义,而不管该属性的实际值如何)

上述情况意味着:

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


等价于它们的计算结果为真实值。

无需处理这样一个事实,即即使是空的
readonly
属性也会导致元素为只读,但
$(“输入[id='Date input 1'])。@readonly
计算结果为虚假值(由于
@readonly
返回的属性值在您的情况下是空字符串)为什么不将导航器转换为的实例并使用它提供的
isReadOnly()
属性方法

$("input[id='Date Input 1']").module(FormElement).readOnly
编辑 正如kriegaex所指出的,
$(“输入[id='Date input 1'])。@readonly
实际计算结果为真实值(因为WebDriver在获取
readonly
属性的值时总是返回一个包含
true
的字符串,只要该属性在元素上定义,而不管该属性的实际值如何)

上述情况意味着:

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


等价于它们的计算结果是真实值。

这似乎不起作用。在你的注释之后,我意识到我在帖子中使用了{}而不是(),但在我的代码中,我实际上使用了()…我也知道ID中的空格不好,但是,这是一个遗留应用程序,在给定约束条件下,我无权对其进行更改…这是我在尝试@readonly
条件未满足时收到的错误消息:page.input1Example.@readonly | | | | |“”| page->input1Example:geb.navigator.NonEmptyNavigator java.package.page
您一定犯了错误。我的解决方案是正确的,经过测试。除非您提供其他证明,否则我假设问题就在计算机前面。;-)根据你提供的信息,我不能再多说了。这似乎不起作用。在你的留言之后,我意识到我在帖子中使用了{}而不是(),但在我的代码中,我实际上使用了()…我也知道ID中的空格不好,但是,这是一个遗留应用程序,在给定约束条件下,我无权对其进行更改…这是我在尝试@readonly
条件未满足时收到的错误消息:page.input1Example.@readonly | | | | |“”|页面->输入1示例:geb.navigator.Non