2015-11-13 25 views
0

我正在學習如何使用selendroid自動化Python中的移動應用程序。Selendroid Python ActivityNotFound異常

我跟着http://selendroid.io/mobileWeb.html,併成功地讓移動Web模擬工作。

但我在使本機應用程序示例工作http://selendroid.io/native.html時遇到問題。

我的目標是能夠測試instagram應用程序。

這是我遵循的步驟:

  1. 我從 http://www16.zippyshare.com/d/ItozZOlJ/28269/com.instagram.android-7.9.2-APK4Fun.com.apk下載的Instagram的apk文件,並把它安裝一個藍疊模擬器

  2. 接下來,我開始與apk文件中的硒獨立服務器作爲應用參數

    java -jar selendroid-standalone-0.17.0-with-dependencies.jar -aut H:\PDS\andriod\com.instagram.android-7.9.2-APK4Fun.com.apk 
    
  3. 要驗證一切是否爲低交鋒罰款我檢查了鏈接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標識。

  4. 現在我寫的腳本能夠啓動的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清單?)
  • 我在做腳本中的錯誤嗎?
  • 可以使用bluestacks與問題有關嗎?

回答

0
  1. 您可以檢查AndroidManifest使用apktool什麼。主要活動也在selendroid服務器日誌中指定,當您啓動它時。
  2. 如果您反編譯應用程序,將其添加到AndroidManifest中並編譯回來,您可能會這樣做。這可能不會對你有所幫助,因爲即使你要在清單中添加一個新的活動,你的應用程序也不會使用該活動,除非編寫代碼來完成這項工作。
  3. 沒有真正
  4. 還不如就我所知

我有完全相同的問題

的問題可以在這裏看到:

Unable to find explicit activity class {io.selendroid.androiddriver/com.instagram.android.activity.MainTabActivity}; have you declared this activity in your AndroidManifest.xml? 

Selendroid嘗試使用活動,位於默認應用程序,硒服務器具有而不是您通過應用程序的說法。這是io.selendroid.androiddriver。可能是一個bug

尋找解決方案雖然