草庐IT

android - 从可访问性获得空根节点 - UiAutomator

coder 2023-12-15 原文

我得到了 从可访问性中获得空根节点 - 正在重试... 来自 UiAutomator 的消息,我不知道为什么。

很快:

我们正在我们的应用程序上执行 E2E 测试,每个测试都从启动 Activity 开始。第一个测试运行成功。当第二个测试开始时,一切都很好,直到我们开始找到一个 UiObject。在那次通话中,我们遇到了错误。

详细:

第一个测试启动 StartActivity 并通过引导导航到 MainScreen

开始屏幕开始:

val intent = Intent(appContext, StartActivity::class.java)
appContext.startActivity(intent)

我也试过这样的:

val intent = appContext.packageManager.getLaunchIntentForPackage(appContext.originalPackageName).apply {
    addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
appContext.startActivity(intent)

但没有区别,因为测试运行器会在测试运行后自动检查是否有正在运行的 Activity ,并将其清除。

当第二个测试运行时,它仍然从 StartActivity 开始,但现在跳过了入职流程,用户(测试运行者)被导航到包含 Continue<> 按钮。 因此,我们正在寻找一个带有文本 Continue 的 UiObject 并等待它出现在屏幕上。一旦它出现,我们将单击它。但是,一旦我们启动“找到继续按钮”,标题中的消息就开始出现,几秒钟后一切都崩溃了: 测试运行失败:由于“进程崩溃”,检测运行失败。

fragment :

val continueButton = viewByText { appContext stringOf R.string.all_continue }
continueButton.waitToBecomeVisible(1.minute)
continueButton.click()

我想最后一个问题是,是什么导致 UiAutomator 丢失所有根节点? 调试 UiDevice 中的方法,例如 getUiAutomationgetWindowRoots 和来自 QueryContoller 的实际 getRootNode() >,记录上面的消息,没有帮助。

语法糖:

appContext

val appContext: Context get() = InstrumentationRegistry.getTargetContext() 

viewByText:

fun viewByText(text: () -> String): UiObject = device.objectByText { text() }

infix fun UiDevice.objectByText(text: () -> String): UiObject = 
    findObject(UiSelector().text(text()))

waitToBecomeVisible:

infix fun UiObject.waitToBecomeVisible(timeOutMillis: Long) {
    if(!waitForExists(timeOutMillis)){
        throw UiObjectNotFoundException(
            "Timeout: ${timeOutMillis.toDouble()/1000}s. ${this.selector}"
        )
    }
}

最佳答案

我觉得有必要回答这个问题,因为这根本不是 UIAutomator 的问题。

消息 Got null root node from accessibility - Retrying... 是您会一直在日志中找到的内容。但是,UIAutomator 能够在几次重试后继续。

在我们的例子中,我们正在测试的应用程序有一个 SignalR 集成与错误的“生命周期”实现。结合上述状态,当重试正在进行时,SignalR 因 NPE 而失败,导致应用程序崩溃,结果,测试仪器进程也崩溃了。

我们花了很长时间才弄清楚这种情况对应用程序和测试造成的影响,但好在我们解决了 SignalR 中的严重错误。

因此,如果测试仪器运行器发生崩溃并记录了一堆 Got null... 消息,请尝试寻找其他原因,因为主线程在重试和生命周期感知期间被阻塞组件可能会遇到麻烦。

关于android - 从可访问性获得空根节点 - UiAutomator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999425/

有关android - 从可访问性获得空根节点 - UiAutomator的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  6. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

  7. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  8. ruby - 使用 Class.new 时访问外部范围 - 2

    是否有可能以某种方式访问​​Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(

  9. ruby - 使用访问器方法即时创建对象 - 2

    使用散列定义的访问器方法动态创建对象的最简单方法是什么?例如,如果我有一个散列:{foo:"Foo",bar:"Bar"}我想要一个具有访问器方法foo、foo=、bar和bar=的对象,其初始值分别为"Foo"和"Bar"。我可以想到这样做:moduleObjectWithAccessordefself.newh;Struct.new(*h.keys).new(*h.values)endendo=ObjectWithAccessor.new(foo:"Foo",bar:"Bar")o.foo#=>"Foo"但是,我不需要它们的多个实例具有相同的特定键集,而是希望每次都使用可能不同的键

  10. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

随机推荐