Ruby 带有页面对象模式的非帮助性错误消息葫芦

Ruby 带有页面对象模式的非帮助性错误消息葫芦,ruby,calabash,pageobjects,calabash-ios,calabash-android,Ruby,Calabash,Pageobjects,Calabash Ios,Calabash Android,我目前正在使用葫芦框架来自动化本地Android和IOS应用程序的功能测试。在我研究它的过程中,我偶然发现Xamarin使用了页面对象设计模式,我发现用Selenium方式组织代码会更好 我对原始项目做了一些调整,在葫芦项目结构的support目录中添加了一个名为page_utils.rb的文件。此文件具有以下方法: def change_page(next_page) sleep 2 puts "current page is #{current_page_name} changin

我目前正在使用葫芦框架来自动化本地Android和IOS应用程序的功能测试。在我研究它的过程中,我偶然发现Xamarin使用了页面对象设计模式,我发现用Selenium方式组织代码会更好

我对原始项目做了一些调整,在葫芦项目结构的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中更改页面的事件,并更新调用此方法的葫芦的引用,例如:

@current_page.click_to_home_page
change_page(HomePage)
PAGE_TRANSITION_参数是一个包含超时等参数的哈希:

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是为我的应用程序中第一个屏幕的特征定义的id,我不明白为什么它会在屏幕前面的几步中不断出现,从而掩盖了真正的问题。 有人能帮我摆脱这种烦恼吗?调试测试失败非常困难,特别是在测试云上。

欢迎使用葫芦

如您所知,当您尝试查询/等待屏幕上找不到的元素时,您将获得等待元素的
超时:
异常。当您调用
page.wait(opts)
时,它实际上是在调用
wait\u for\u elements\u exist([trait],opts)
,这意味着在等待10秒后,在屏幕上找不到id为
btn\u ok
的视图

什么是
assert\u info\u present
?它是否调用
等待\u元素\u存在
或类似的东西?更重要的是,在
page_utils.rb:14
中实际调用了什么方法

当你调用
点击主页时,你的应用程序是否真的返回到主屏幕

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

在没有看到您的应用程序或步骤定义的情况下,我的第一个猜测是
@current\u页面。单击\u to\u home\u页面
实际返回主页需要10秒以上的时间。如果是这种情况,只需增加超时时间(或者完全删除超时时间,因为默认值为30秒)

我的第二个猜测是,当应用程序返回主屏幕时,id为
btn_ok
的元素实际上在屏幕上不可见。如果是这种情况,您可以尝试将
trait
定义从
*id:'btn\u ok'
更改为
all*id:'btn\u ok'
all
操作符将包括在屏幕上实际不可见的视图)。再说一次,我不知道你的应用程序看起来像什么,所以很难说

我的第三个猜测是它与
assert\u info\u present
有关,但很难说没有看到步骤defs

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

希望这有帮助!祝你好运

欢迎来到葫芦

如您所知,当您尝试查询/等待屏幕上找不到的元素时,您将获得等待元素的
超时:
异常。当您调用
page.wait(opts)
时,它实际上是在调用
wait\u for\u elements\u exist([trait],opts)
,这意味着在等待10秒后,在屏幕上找不到id为
btn\u ok
的视图

什么是
assert\u info\u present
?它是否调用
等待\u元素\u存在
或类似的东西?更重要的是,在
page_utils.rb:14
中实际调用了什么方法

当你调用
点击主页时,你的应用程序是否真的返回到主屏幕

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

在没有看到您的应用程序或步骤定义的情况下,我的第一个猜测是
@current\u页面。单击\u to\u home\u页面
实际返回主页需要10秒以上的时间。如果是这种情况,只需增加超时时间(或者完全删除超时时间,因为默认值为30秒)

我的第二个猜测是,当应用程序返回主屏幕时,id为
btn_ok
的元素实际上在屏幕上不可见。如果是这种情况,您可以尝试将
trait
定义从
*id:'btn\u ok'
更改为
all*id:'btn\u ok'
all
操作符将包括在屏幕上实际不可见的视图)。再说一次,我不知道你的应用程序看起来像什么,所以很难说

我的第三个猜测是它与
assert\u info\u present
有关,但很难说没有看到步骤defs

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


希望这有帮助!祝你好运

再次您好@Christophentes您总是对我的问题很有帮助+1美元。方法
assert\u info\u present
只是一种方法,它检查页面对象提供的ids数组在屏幕上是否存在和可见一些ID。我已经在最近的测试中对此进行了评论。关于你的猜测,我不这么认为