【问题标题】:Appium / selendroid code is slowing down over timeAppium / selendroid 代码随着时间的推移而变慢
【发布时间】:2014-07-28 03:19:44
【问题描述】:

我使用 Robot Framework、WebDriver 和 Python 通过 Appium 连接到 Android 设备,进行了看似简单、非正式的性能测试。被测应用程序是一个带有本地数据库的包装应用程序,当设备离线时可以将记录存储到该数据库中。我的测试涉及使用 selenium 自动填写“日记”,然后将其写入本地数据库(在测试期间禁用设备 wifi 以防止记录自动推送到服务器)。这是一个非常重复的测试,一个接一个地填写表格并跟踪计数,以及填写然后提交表格所需的时间(日记)。

我注意到的是,随着计数的增加,时间会显着增加,以至于由于错过点击或不太容易定义(抱歉含糊不清)而导致自动化失败。这会在几个小时内发生,因此更改参数和重新运行测试是一件非常耗时的事情。监控 android 上的 cpu 使用情况表明,在没有其他应用程序运行的情况下,被测应用程序运行得不是很努力(平均为 35%,偶尔会爬到 60 的低点)。 Appium 运行在 Mac mini i5 上,我相信它有 2 个内核和 2 个虚拟内核,总共 4 个。Appium 徘徊在 200% 左右,略低于 200%,看起来还不错。

我不知道为什么自动化会随着时间的推移而放缓,并欢迎任何关于为什么会发生的想法。我意识到在没有看到代码运行的情况下进行故障排除是一件非常困难的事情,但是程序非常大并且似乎没有任何特定的故障点。随着时间的推移,它似乎会膨胀到爆裂的程度。一旦发生这种情况,我会回到设备上的应用程序,我可以手动继续输入表单而没有任何问题,因此不会出现数据库已满或应用程序不知何故崩溃的情况。

顺便说一句,我正在使用 Appium 0.18.0。我无法让自动化与 1.1 一起工作,这完全是另一个问题。

编辑:

我昨晚又运行了一次,这次使用 appium 服务器的控制台版本并使用 -q 标志关闭日志记录。就填写并写入本地离线数据库的日记(表格)的数量而言,它更进一步,但这样做的时间越来越长,直到最终应用程序崩溃。然而,这一次,有一个更有用的消息,更清楚地表明 Selendroid/webdriver 的内存问题:

(提前道歉在这里放了一个堆栈转储,但我不知道如何使它更漂亮)

WebDriverException:消息:u'java.lang.OutOfMemoryError\n\tat java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)\n\tat java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)\n\tat java.lang.StringBuilder.append(StringBuilder.java:216)\n\tat io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:182)\n\tat io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:169)\n\tat io.selendroid.server.model.DefaultSelendroidDriver$WebviewSearchScope.lookupElement(DefaultSelendroidDriver.java:427)\n\tat io.selendroid.server.model.internal.AbstractWebElementContext.findElementByCssSelector(AbstractWebElementContext.java:211)\n\tat io.selendroid.server.model.internal.AbstractWebElementContext.findElement(AbstractWebElementContext.java:156)\n\tat io.selendroid.server.model.By$ByCssSelector.findElement(By.java:45)\n\tat io.selendroid.server.model.DefaultSelendroidDriver.findElement(DefaultSelendroidDriver.java:114)\n\tat io.selendroid.server.handler.FindElement.handle(FindElement.java:46)\n\tat io.selendroid.server.AndroidServlet.handleRequest(AndroidServlet.java:286)\n\tat io.selendroid.server.BaseServlet.handleHttpRequest(BaseServlet.java:70)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat io.selendroid.server.inspector.InspectorServlet.handleHttpRequest(InspectorServlet.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.PathMatchHandler.handleHttpRequest(PathMatchHandler.java:33)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.DateHeaderHandler.handleHttpRequest(DateHeaderHandler.java:21)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.ServerHeaderHandler.handleHttpRequest(ServerHeaderHandler.java:25)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:67)\n\tat org.webbitserver.netty.NettyHttpChannelHandler$2.run(NettyHttpChannelHandler.java:72)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)\n\tat java.lang.Thread.run(Thread.java:841)'

我在网上找到了有关浏览器自动化原子的信息,这似乎与故障有关。错误引用了“fineElement”,这当然在我的自动化中经常使用。

https://code.google.com/p/selenium/wiki/AutomationAtoms

我将尝试向 Appium 或 Selendroid 人提出问题,但如果在此期间有人可以帮助我解析这里发生的事情(和/或可能的解决方案或解决方法),我会非常感谢。

编辑:

在此处与 Selendroid 团队记录了一个问题:https://github.com/selendroid/selendroid/issues/438

【问题讨论】:

  • 机器人日志提供了大量的时间信息。作为第一步,你有没有分析过哪些关键字随着时间的推移变得越来越慢?
  • 不幸的是,程序的大部分都在一堆 Python 代码中,这些代码(在一些设置关键字之后)由单个 Robot 关键字触发。我尝试在一个脚本中执行多次运行,执行间隔 2 甚至 10 分钟等待时间的短脉冲,但这并没有帮助。

标签: robotframework appium selendroid


【解决方案1】:

第一步是弄清楚哪个或哪些关键字一直在占用。这将缩小您的调查重点。

根据我对 cme​​ts 的回答,减速似乎与一个基于 python 的关键字无关。下一步将是检测该关键字以查看哪个部分进展缓慢。您可以在函数和方法上使用装饰器来做到这一点,或者只是在打印语句中添加以报告经过的时间。

由于这是一个运行数小时的测试,另一个罪魁祸首可能是机器人记录机制。可能是日志文件正在消耗所有可用内存。因此,您可能希望在测试开始变慢时监控内存使用情况。

尝试的一种选择是将您的测试运行分成更小的部分。运行几百个测试用例然后停止。再跑几百然后停下来,依此类推。完成所有场景后,您可以使用 rebot 工具将所有日志合并到一个报告中。

【讨论】:

  • 非常好的建议,感谢您花时间回答。我在机器人日志中注意到的一件事是,当它最终失败时,它会失败并出现以下错误:文件“/Library/Python/2.7/site-packages/robotframework_selenium2library-1.5.0-py2.7.egg/Selenium2Library /keywords/keywordgroup.py",第 12 行,在 _run_on_failure_decorator 返回方法(*args, **kwargs)
  • 以前它最终会在与硒相关的操作上失败,错过等待或点击。当我最终解决所有这些问题时,它跑得更远了,但现在以这个装饰器消息结束。与此同时,我会看看我能做些什么来减少日志记录。我一直在使用记录器库在运行期间发布大量警告(从机器人运行时打印语句未显示在控制台上)以监控进度。也许这是影响性能的部分原因。
  • 我真的很想像你提到的那样将测试分成多个运行。该应用程序是在 Android 上运行的混合应用程序。有没有办法实例化 webdriver 以获取现有应用程序,切换到 webview 并使用它运行,还是每次运行都必须从头开始重新安装应用程序?
  • @SkipKent:我不知道。
  • 我已向 Selendroid 团队记录了一个问题。如果我收到他们的任何消息,我会发布更新。 github.com/selendroid/selendroid/issues/438
猜你喜欢
  • 2014-02-04
  • 2021-07-22
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多