【问题标题】:Non helpfull error message Calabash with page objects pattern带有页面对象模式的无用错误消息 Calabash
【发布时间】:2016-03-11 09:36:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    欢迎来到葫芦!

    您可能知道,当您尝试查询/等待在屏幕上找不到的元素时,您会收到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 相关,但是如果没有看到步骤定义就很难说。

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

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

    【讨论】:

    • 你好@ChristopherFuentes 你总是对我的问题很有帮助。为此+1。 assert_info_present 方法只是一个方法,用于检查给定页面对象提供的 ids 数组是否存在并在屏幕中可见的几个 id。我已经评论了最新的测试运行。关于你的猜测,我认为这不是问题。由于此 id:'btn_ok' 仅出现在欢迎屏幕中(在启动屏幕之后),并且在那之后该错误一直在逐步弹出。 @current_page.click_to_home_page 只是一个例子,错误发生在其他步骤。
    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2017-01-06
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多