带有页面对象模式的无用错误消息 Calabash

Non helpfull error message Calabash with page objects pattern

我目前正在使用 Calabash 框架自动执行本机 Android 和 IOS 应用程序的功能测试。在我研究它的过程中,我偶然发现了 Xamarin 的 this example project,它使用页面对象设计模式,我发现以 Selenium 方式组织代码要好得多。

我对原来的项目做了一些调整,在calabash项目结构的support目录下添加了一个名为page_utils.rb的文件。这个文件有这个方法:

def change_page(next_page)
  sleep 2

  puts "current page is #{current_page_name} changing to #{next_page}"

  @current_page = page(next_page).await(PAGE_TRANSITION_PARAMETERS)

  sleep 1

  capture_screenshot

  @current_page.assert_info_present
end

所以在我的自定义步骤实现中,当我想更改页面时,我触发了 UI 中更改页面的事件并更新了 Calabash 调用此方法的引用,例如:

@current_page.click_to_home_page
change_page(HomePage)

PAGE_TRANSITION_PARAMETERS是一个hash,参数如timeout:

PAGE_TRANSITION_PARAMETERS = {
  timeout: 10,
  screenshot_on_error: true
}

恰好是,每当我在测试期间等待任何屏幕中的任何元素超时时 运行,我都会收到一条通用错误消息,例如:

Timeout waiting for elements: * id:'btn_ok' (Calabash::Android::WaitHelpers::WaitError)
./features/support/utils/page_utils.rb:14:in `change_page'
./features/step_definitions/login_steps.rb:49:in `/^I enter my valid credentials$/'
features/04_support_and_settings.feature:9:in `And I enter my valid credentials'

btn_ok是我应用中为第一个屏幕的trait定义的id,我不明白为什么即使在该屏幕之前的几步中它也会不断弹出,掩盖了真正的问题。 任何人都可以帮助摆脱这种烦恼吗?调试测试失败真的很辛苦,特别是在测试云上。

欢迎来到 Calabash!

如您所知,当您尝试 query/wait 一个在屏幕上找不到的元素时,您会得到一个 Timeout waiting for elements: 异常。当你调用page.await(opts)时,它实际上是在调用wait_for_elements_exist([trait], opts),这意味着在你的情况下等待10秒后,在屏幕上找不到id为btn_ok的视图。

什么是assert_info_present?它调用 wait_for_element_exists 或类似的东西吗?更重要的是, page_utils.rb:14 中实际调用了什么方法?

当您调用 click_to_home_page 时,您的应用程序实际上 return 到主屏幕了吗?

不幸的是,如果没有更多信息,很难诊断问题,但我会提出一些建议:

在没有看到您的应用程序或步骤定义的情况下,我的第一个猜测是 @current_page.click_to_home_page 实际返回主页所用的时间超过 10 秒。如果是这种情况,只需尝试增加超时(或完全删除它,因为默认值为 30 秒。See source)。

我的第二个猜测是,当您的应用 return 进入主屏幕时,id 为 btn_ok 的元素实际上在屏幕上不可见。如果是这种情况,您可以尝试将 trait 定义从 * id:'btn_ok' 更改为 all * id:'btn_ok'all 运算符将包括实际上在屏幕上不可见的视图)。同样,我不知道您的应用程序是什么样子,所以很难说。

我的第三个猜测是它与 assert_info_present 有关,但如果没有看到步骤 defs 很难说。

顺便说一句,如果我们的示例代码有点过时,我深表歉意,但在撰写本文时,我们通常不鼓励使用 @current_page 来跟踪页面。 Calabash 或多或少是以无状态的方式编写的,我们通常鼓励步骤定义尽可能避免使用状态。

希望这对您有所帮助!祝你好运。