非有用的错误消息Calabash与页面对象模式

时间:2016-03-10 15:00:47

标签: ruby calabash pageobjects calabash-ios calabash-android

我目前正在使用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是一个带有参数的哈希:

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,我不明白为什么即使在屏幕前面的步骤中也会出现这种情况,掩盖真正的问题。 任何人都可以帮助摆脱这种烦恼吗?使测试失败变得非常困难,特别是在测试云上。

1 个答案:

答案 0 :(得分:2)

欢迎来到Calabash!

您可能知道,当您尝试查询/等待无法在屏幕上找到的元素时,您会收到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时,您的应用实际上是否会返回主屏幕?

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

我没有看到你的应用程序或你的步骤定义的第一个猜测是@current_page.click_to_home_page需要超过10秒才能真正恢复主页。如果是这种情况,只需尝试增加超时(或完全删除它,因为默认值为30秒。See source)。

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

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

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

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