【发布时间】:2016-07-28 20:16:00
【问题描述】:
我正在学习如何使用 selendroid 在 Python 中自动化移动应用程序。
我关注了http://selendroid.io/mobileWeb.html,并成功地让移动网络模拟工作。
但我无法让本机应用示例正常工作http://selendroid.io/native.html。
我的目标是能够测试 instagram 应用程序。
这些是我遵循的步骤:
我从以下位置下载了 instagram apk 文件 http://www16.zippyshare.com/d/ItozZOlJ/28269/com.instagram.android-7.9.2-APK4Fun.com.apk 并将其安装在 BlueStacks 模拟器上
-
接下来我用apk文件作为app参数启动selenium独立服务器
java -jar selendroid-standalone-0.17.0-with-dependencies.jar -aut H:\PDS\andriod\com.instagram.android-7.9.2-APK4Fun.com.apk -
为了验证是否一切正常,我检查了链接 http://localhost:4444/wd/hub/status 并得到:
{ status: 0, value: { supportedApps: [ { appId: "io.selendroid.androiddriver:0.17.0", mainActivity: "io.selendroid.androiddriver.WebViewActivity", basePackage: "io.selendroid.androiddriver" }, { appId: "com.instagram.android:7.9.2", mainActivity: "com.instagram.android.activity.MainTabActivity", basePackage: "com.instagram.android" } ], os: { arch: "amd64", name: "Windows 8.1", version: "6.3" }, build: { browserName: "selendroid", version: "0.17.0" }, supportedDevices: [ { platformVersion: "23", emulator: true, apiTargetType: "google", avdName: "Nexus_5_API_23_x86" } ] } }这应该意味着一切都很好。我已经识别了我的设备,并且加载了 apk 文件并识别了 MainActivity。
-
现在我编写脚本以启动 instagram 应用程序
# initiate the driver driver = webdriver.Remote(desired_capabilities=webdriver.DesiredCapabilities.ANDROID) # switch to native app driver.switch_to.window("NATIVE_APP") try: # try to start the MainTabActivity driver.get("and-activity://com.instagram.android.activity.MainTabActivity") finally: driver.quit()当我执行脚本时,我收到以下错误:
Traceback (most recent call last): File "F:\Program Files (x86)\JetBrains\PyCharm 5.0\helpers\pydev\pydevd.py", line 2403, in <module> globals = debugger.run(setup['file'], None, None, is_module) File "F:\Program Files (x86)\JetBrains\PyCharm 5.0\helpers\pydev\pydevd.py", line 1794, in run launch(file, globals, locals) # execute the script File "H:/PDS/BNP/bots/xexamples/connect_to_phone.py", line 12, in <module> driver.get("and-activity://com.instagram.android.activity.MainTabActivity") File "H:\program files\Anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 213, in get self.execute(Command.GET, {'url': url}) File "H:\program files\Anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute self.error_handler.check_response(response) File "H:\program files\Anaconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: CATCH_ALL: android.content.ActivityNotFoundException: Unable to find explicit activity class {io.selendroid.androiddriver/com.instagram.android.activity.MainTabActivity}; have you declared this activity in your AndroidManifest.xml? at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1723) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1511) at android.app.ContextImpl.startActivity(ContextImpl.java:1039) at android.app.ContextImpl.startActivity(ContextImpl.java:1021) at io.selendroid.server.ServerInstrumentation.startActivity(ServerInstrumentation.java:77) at io.selendroid.server.model.SelendroidNativeDriver.get(SelendroidNativeDriver.java:115) at io.selendroid.server.model.DefaultSelendroidDriver.get(DefaultSelendroidDriver.java:522) at io.selendroid.server.handler.OpenUrl.safeHandle(OpenUrl.java:38) at io.selendroid.server.handler.SafeRequestHandler.handle(SafeRequestHandler.java:86) at io.selendroid.server.AndroidServlet.handleRequest(AndroidServlet.java:264) at io.selendroid.server.common.BaseServlet.handleHttpRequest(BaseServlet.java:67) at io.selendroid.server.common.http.ServerHandler.channelRead(ServerHandler.java:53) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) at io.netty.handler.traffic.AbstractTrafficShapingHandler.channelRead(AbstractTrafficShapingHandler.java:223) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:148) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:430) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:384) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:841)它抛出 ActivityNotFoundException 错误,并询问我是否在 AndroidManifest.xml 中声明了此活动
问题:
- 如何检查 AndroidManifest 中是否声明了某些内容?
- 如果没有声明,我该如何声明? (安装应用程序不应该自动将其放入 Android Manifest 中吗?)
- 我在脚本中做错了吗?
- 使用 bluestacks 是否与问题有关?
【问题讨论】:
标签: python selenium android-activity selendroid