【问题标题】:Geb does not insert the text in frame's input fieldGeb 不会在框架的输入字段中插入文本
【发布时间】:2017-08-21 13:52:23
【问题描述】:

我的页面上有以下设置:

<html>
<body>
    <frame name="header" ></frame>
    <frame name="footer" ></frame>
    <frame name="inline" >

        <input type="text" id:"fname">

     </frame>

<body>
</html>

我想在带有 id 的字段中写一个文本

名字

我尝试了几个选项,但以下是最后一个。

class PageWithFrame extends Page {
static content = {
    myFrame(page: FrameDescribingPage) { $('frame',name:'inline') }
   }
}

class FrameDescribingPage extends Page {
  static content = {
    framefirstname { $('input', id:'fname') }
  }
}

 ...
 ...


 Then:
     to PageWithFrame

       withFrame(myFrame) {
    framefirstname.value("Hallooo") 
  }

代码本身运行成功,没有任何错误。但是它不会填充输入字段。调试也没有提供太多信息。

有没有人知道这里发生了什么。

【问题讨论】:

  • 您确定您的代码运行没有任何问题吗?以下对我来说看起来不是有效的 html:&lt;input type="text" id:"fname"&gt;,据我所知,这不是有效的 Groovy:$('input', id='fname')。还是这些只是复制和粘贴错误?
  • @erdi 你是对的。这是我在编辑时犯的一个打字错误。它是 $('input', id:'fname')
  • 所以只是为了进行健全性检查,浏览器控制台可以找到 $('input', id:'fname') 并在您的测试 framefirstname.isDisplayed() 中返回 true?
  • @Doug Clark 浏览器控制台无法直接找到 $('input', id:'fname') 因为它在框架中。这就是为什么我必须首先使用 myFrame(page: FrameDescribeingPage) { $('frame',name:'inline') } 引用框架。 Justin Schoen 的答案是正确的。问题是页面如何以我可以操作模块元素的方式接收有关框架模块的信息。
  • 抱歉,不是您的浏览器驱动程序,而是您手动转到此页面。浏览器应该能够找到页面中的任何内容。我要问的是你确定你的选择器正在返回一些东西

标签: groovy automated-tests spock geb


【解决方案1】:

Geb 已内置模块,可用于填写字段、从列表中选择或选择复选框等。您需要 Text Input module

修改您的页面对象,如下所示。这会导入 TextInput 模块以供使用,然后将您的“framefirstname”内容初始化为模块,让您可以访问 Geb 提供的各种方法。如上一条评论所述,根据Geb standards.调整你的'framefirstname'内容

import geb.module.TextInput
framefirstname { $('input', id:'fname').module(TextInput) }

Geb 为文本输入模块提供了一个 .text 函数,因此您在测试中需要做的就是以下内容,它应该设置您的输入字段:

framefirstname.text = "n"

【讨论】:

  • 我现在遇到的问题是如何通知 FrameDescribeingPage 关于模块,然后在我的测试中操作我的模块的元素。由于在这种情况下元素在框架中,而 myFrame 只能接收页面作为参数
  • 从您的 html 外观来看,“framefirstname”应该只是“PageWithFrame”页面上的一段内容。如果我错了,或者我遗漏了什么,请纠正我,但我认为如果它是在您的“PageWithFrame”页面的内容中定义的,您可能不会遇到同样的问题。
  • 不是直接的。它是一个FrameDescribeingPage。由于对 FrameDescribeingPage 的引用,它是 PageWithFrame 的内容。我试图通过 PageWithFrame 一个带有框架信息的模块,但在测试中我无法访问框架的元素
  • 您是否尝试过以下方法: class PageWithFrame extends Page { static content = { myFrame { $('frame',name:'inline') } framefirstname { $('input', id:'fname ').module(TextInput) } } } 然后:到 PageWithFrame framefirstname.text = "n"
【解决方案2】:

到目前为止,你做得很好。如果页面在新标签页中?如果是,你可以 withNewWindow 或 withWindow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多