我目前正在使用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,我不明白为什么即使在屏幕前面的步骤中也会出现这种情况,掩盖真正的问题。 任何人都可以帮助摆脱这种烦恼吗?使测试失败变得非常困难,特别是在测试云上。
答案 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以或多或少的无状态方式编写,我们通常鼓励步骤定义以避免尽可能使用状态。
希望这有帮助!祝你好运。