带有页面对象模式的无用错误消息 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 或多或少是以无状态的方式编写的,我们通常鼓励步骤定义尽可能避免使用状态。
希望这对您有所帮助!祝你好运。
我目前正在使用 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 或多或少是以无状态的方式编写的,我们通常鼓励步骤定义尽可能避免使用状态。
希望这对您有所帮助!祝你好运。