Geb 的一般问题(StaleElementReferenceException 和等待超时)

2023-12-21

根据“Geb之书”,我开始绘制我们门户网站的网页。我更喜欢使用静态内容闭包块中定义的变量,然后在页面方法中访问它们:

static content = {
    buttonSend { $("input", type: "submit", nicetitle: "Senden") }
}
def sendLetter() {
    waitFor { buttonSend.isDisplayed() }
    buttonSend.click()
}

不幸的是,有时我会遇到 Geb 等待超时异常(60 秒后),或者更糟糕的是我收到众所周知的“StaleElementReferenceException”。

使用“isEnabled”而不是“isDisplayed”时,我可以避免等待超时,但对于“StaleElementReferenceException”,我只能应用以下解决方案:

def sendLetter() {
    waitFor { buttonSend.isEnabled() }
    try {
        buttonSend.click()
    } catch (StaleElementReferenceException e) {
        log.info(e.getMessage())
        buttonSend.click()
    }
}

我想,这个解决方案并不是很好,但我无法应用另一篇文章中描述的显式等待。因此,我有一些一般性问题:

  • 当页面动态时,我是否应该避免使用静态内容定义?
  • Geb 在什么时间或事件刷新其 DOM?如何触发 DOM 刷新?
  • 为什么我在使用 CSS 选择器时仍然收到“StaleElementReferenceException”?

我将不胜感激每一个有助于理解或解决这个问题的提示。最好是有一个简单的代码示例,因为我仍然是初学者。谢谢你!


如果您在页面类上定义了 at 检查,页面将首先验证该条件并等待前 n 秒。这是在您的gebConfig 文件中分配的。默认值为 30 秒。

static at = {
    waitFor { buttonSend.isDisplayed() }
}

因此,一旦您通过测试或任何您在页面上使用的方法调用页面“to”方法,页面就会等待,然后执行页面操作。

to MyPage
buttonSend.click()

当页面动态时,我是否应该避免使用静态内容定义?

不,实际上,静态定义是闭包。那么什么是 实际发生的是每次您使用静态页面时 您正在调用一个在其上动态运行的闭包的组件 当前页面(webElements 的集合)。理解这一点是关键 使用 Geb 并发现您将遇到的问题。

Geb 在什么时间或事件刷新其 DOM?如何触发 DOM 刷新?

当您调用:to、go、at、click 、withFrame(frame, page)、withWindow 和浏览器驱动方法它将刷新当前的设置 Web 元素。 Geb 有一系列很好的实用程序来进行切换 页面之间和等待页面的操作变得简单。注:Geb 是 实际上建立在WebDriver WebElements http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html.

为什么我在使用 CSS 选择器时仍然收到“StaleElementReferenceException”?

页面可能尚未完成加载,已被操纵 使用 ajax 调用或已以其他方式刷新。有时一个 'at' PAGE 方法调用可以解决这些问题。他们最适合我 使用框架时很常见,因为 Geb 似乎在页面之间变得混乱 和框架一点。有解决方法。

简而言之,如果您使用页面模式,您可以使用您使用静态内容、at 和 url 闭包定义的 Page 类轻松切换预期页面,如下所示:

  • to(Page)
  • at(Page)
  • 导航器.单击(页面)
  • withFrame(框架, 页面) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Geb 的一般问题(StaleElementReferenceException 和等待超时) 的相关文章

随机推荐

  • React 是否保持状态更新的顺序?

    我知道React可能会异步批量执行状态更新以优化性能 因此 您永远不能相信调用后状态会更新setState 但你能相信React吗按照与以下相同的顺序更新状态setState叫做 for 相同的组件 不同的组件 考虑单击以下示例中的按钮 1
  • 如何在 Rails 中的 Google Universal Analytics 跟踪代码中设置 USER_ID?

    以下是我的基于 Rails 的应用程序的 Universal Analytics 跟踪代码 可以在 analytics html erb 它作为部分加载application html erb
  • 将字符串与 Java 中声明为 Final 的 == 进行比较

    我有一个关于 Java 中字符串的简单问题 下面的简单代码段只是连接两个字符串 然后将它们与 String str1 str String str2 ing String concat str1 str2 System out printl
  • Django:如何使用自定义模板制作表单?

    我有一个模型 class Setting models Model class Meta abstract True name models CharField max length 120 primary key True descrip
  • 如何从一张画布复制到另一张画布

    我想复制在一张画布上绘制的图像 details http developer android com reference android graphics Canvas html 进入另一个画布 通常讨论的使用位图的解决方案将不起作用 因为
  • Django ORM - 百分号代表类似

    在我的网站上 用户应该能够过滤数字 例如 123 321 这将匹配 666123 555 321111 或LIKE 123 321 默认情况下django的orm转义 sign https docs djangoproject com en
  • 等待多张图片加载

    我有多个图像要加载 并将它们放入一个数组中 在循环中 加载图像时我会增加计数器 当这个计数器等于我的图像的数组长度时 我想删除加载指示器 我不知道为什么 这不起作用 new Vue el app created let imageLoade
  • Angular 4 服务中的数据,传递给组件

    服务中有一些数据 当我在服务上的对象中有数据时 它工作得很好 但现在我已经连接了数据库连接 数据永远不会到达组件 我希望该服务订阅从数据库返回的数据并定义如下调用 public setPerson ac string void consol
  • 高请求场景下Java Threadpool vs. new Thread

    我有一些用于 REST 服务的旧 Java 代码 该服务对每个传入请求使用单独的线程 IE 主循环将在 socket accept 上循环并将套接字移交给 Runnable 然后 Runnable 将启动自己的后台线程并调用自身运行 这在一
  • 将执行文本/模板模板的结果分配给变量[重复]

    这个问题在这里已经有答案了 type Inventory struct Material string Count uint sweaters Inventory wool 17 tmpl err template New test Par
  • iPhone - 不同应用程序有相同的配置文件吗?

    您可以使用相同的配置文件为 App Store 编译 2 个不同的应用程序吗 我想不是 但只是想知道 我非常确定您不能在 App Store 提交的 appID 中使用通配符 您可以使用类似的方法构建和调试所有应用程序GK46RTKQ4V
  • 通过查询查找组中的最后一行-SQL Server

    我在 SQL Server 中有表 我想找到每组中的最后一行 我尝试使用以下查询 但它没有返回准确的结果 ID列是PK 其他列设置为NOT NULL select ID Name FROM select ID Name max ID ove
  • Rails distance_of_time_in_words 返回“en, about_x_hours”

    我遇到了一个奇怪的问题 希望有人知道问题是什么 使用 distance of time in words 以及 time ago in words 不会返回实际的时间距离 相反 它返回诸如 en about x hours 或 en x m
  • 如何使用 Xcode 4.2 使用 ios 4.2 基础 sdk?

    如何使用 Xcode 4 2 使用 ios 4 2 基础 sdk 我拥有一部 iPhone 4s 和一部装有 ios 4 2 的 iTouch 将 Xcode 升级到 4 2 以与我的 iPhone 4s 配合使用后 我无法再将 Xcode
  • 在 Amazon EC2 微实例中运行 Play 框架应用程序

    我有一个非常基本的玩法 应用程序只处理几个正常的 GET 和 POST 请求并与 MySQL 数据库对话 没什么花哨的 I ran play dist并将 zip 文件传输到我的 EC2 实例 解压后 进入bin文件夹并运行 myapp 我
  • 解析来自 http get 的多部分响应

    我正在开发两个应用程序之间的集成 应用程序 1 使用 HttpClient GetMethod 向应用程序 2 发出请求 应用程序 2 将返回嵌入文件的多部分响应 我认为这是一个简单的练习 但似乎找不到解析 HTTP GET 的多部分响应的
  • Ngrx Effects 规范抛出错误“未初始化测试调度程序”

    尝试使用现有的和最近迁移的 Angular 7 项目运行简单的效果测试 但我收到如下错误 错误 未初始化测试调度程序在 getTestScheduler node modules jasmine marbles es6 src schedu
  • android中如何实现下拉刷新?

    目前我正在开发一个片段 它只是一个带有框架布局的网络视图 问题是 我想做类似的事情下拉刷新 就像列表视图中常见的一些刷新功能一样 假设有一个refreshToDo 功能 我所需要的只是一个布局 当我拖动主体时 它会显示刷新标题 当标题达到一
  • 通过 PHP 显示数据库中的 Base64 图像

    我有这个数据库 其中包含图像作为字符串 这些字符串看起来像这样 data image jpeg base64 9j 4AAQSkZJRgABAQEAYABgAAD 我需要创建一个显示该图像的链接 喜欢something com id 27是
  • Geb 的一般问题(StaleElementReferenceException 和等待超时)

    根据 Geb之书 我开始绘制我们门户网站的网页 我更喜欢使用静态内容闭包块中定义的变量 然后在页面方法中访问它们 static content buttonSend input type submit nicetitle Senden de