【问题标题】:Checking for readonly in Geb在 Geb 中检查只读
【发布时间】:2018-05-11 21:34:38
【问题描述】:

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

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

这是一个通用示例:

<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")

我运气不太好..

【问题讨论】:

    标签: groovy automation automated-tests spock geb


    【解决方案1】:

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

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

    编辑 正如 kriegaex 所指出的,$("input[id='Date Input 1']").@readonly 实际上计算为 truthy 值(因为只要定义了属性,当获取 readonly 属性的值时,WebDriver 总是返回一个包含 true 的字符串在元素上,无论该属性的实际值如何)。

    以上意思是:

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

    和:

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

    是等价的,因为它们评估为 truthy 值。

    【讨论】:

    • 虽然这是一个很好的答案,当然比我的更优雅,但如果属性为 readonly=""$("input[id='Date Input 1']").@readonly 应该评估为 false 的声明是不正确的。我也曾假设过,但在测试它时,我发现readonly 的绝对存在使其评估为true,即使该值为空字符串。我什至刚刚通过一个例子扩展了我的答案。
    • 你是对的,kriegaex。我也做了一些测试,看起来 WebDriver 在获取readonly 属性的值时总是返回一个包含true 的字符串,只要该属性是在元素上定义的,而不管该属性的实际值如何。这意味着你的答案也是正确的。
    • 感谢您的调查。剩下的唯一谜团是,为什么@PackersFan 说我的解决方案对他不起作用,但你的解决方案显然对他有用,因为他接受了答案。我认为他在尝试我的解决方案时犯了一个错误。无论如何,SO 是关于学习的,我们都在这里学到了一些东西。 :-)
    【解决方案2】:

    这里有几个问题:

    • 您使用带有内联空格的 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
    

    【讨论】:

    • 这似乎不起作用。在您的注释之后,我意识到我在帖子中使用 {} 而不是 (),但在我的代码中,我实际上使用的是 ()...我也知道 ID 中的空格是不好的,但是,它是一个遗留应用鉴于我的限制,我无权进行更改...这是我在尝试@readonly Condition not satisfied: page.input1Example.@readonly | | | | | "" | page -&gt; input1Example: geb.navigator.NonEmptyNavigator java.package.page 后收到的错误消息
    • 你一定是搞错了。我的解决方案是正确的并且经过测试。除非您提供MCVE 证明否则,我假设问题出在计算机前面。 ;-) 根据我从你那里得到的信息,我不能说更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多