2013-05-29 77 views
3

我想對使用Appium的HelloWorld Android應用程序進行簡單的單元測試。我的Android應用程序有一個Activity,在屏幕上加載後,它在TextView上顯示「Hello World」。我想要的是使用Python編寫單元測試用例,它可以像我期望的那樣工作,並使用Appium進行測試。如何在Ubuntu中使用Appium進行Android單元測試

我不明白的主要是我的Android項目,Appium和Python腳本之間的連接。

我想我已經在我的Ubuntu-12.04中正確配置了Appium。當我給在終端下面的命令

[email protected]:~$ appium & 

它提供了以下回應

anuja @ anuja-MulTplx:〜$信息:Appium REST HTTP接口監聽 開始0.0.0.0:4723

我已經寫了簡單的Python腳本,用於Selenium WebDriver的Web單元測試。但我不知道如何編寫一個Python腳本來使用Appium來測試我的Android應用程序。需要一個例子或好的文檔。

感謝


後增加這部分@Dan Cuellar答案。

我使用一個終端啓動服務器後,我從另一個包含python綁定的終端運行我的python腳本。

在它給下面出Appium服務器運行終端把

debug: Appium request initiated at /wd/hub/session 

debug: Request received with params: {"sessionId":null,"desiredCapabilities":{"app-package":"my.app.package","app":"/home/anuja/MobileDev/apks_and_keys/Trickbook.apk","browserName":"","version":"4.0.4","device":"Android","app-activity":"TrickbookSplasher"}} 

info: Using local app from desiredCaps: /home/anuja/MobileDev/apks_and_keys/Trickbook.apk 

info: Creating new appium session 4788d549-d39a-4730-9bdb-382418c2b2c9 

info: Starting android appium 

debug: Using fast reset? true 

info: Preparing device for session 

info: Checking whether app is actually present 

info: Checking whether adb is present 

info: [ADB] Using adb from /home/anuja/MobileDev/sdk/platform-tools/adb 

info: Trying to find a connected android device 

info: [ADB] Getting connected devices... 

info: [ADB] 1 device(s) connected 

info: [ADB] Setting device id to 4d017b1f209a3f7b 

info: Found device, no need to retry 

info: [ADB] Waiting for device 4d017b1f209a3f7b to be ready and to respond to shell commands (timeout = 5) 

info: Checking whether we need to run fast reset 

debug: Checking app cert for /tmp/my.app.package.clean.apk: java -jar "/usr/lib/node_modules/appium/app/android/verify.jar" "/tmp/my.app.package.clean.apk" 

debug: App not signed with debug cert. 

debug: Checking app cert for /home/anuja/MobileDev/apks_and_keys/Trickbook.apk: java -jar "/usr/lib/node_modules/appium/app/android/verify.jar" "/home/anuja/MobileDev/apks_and_keys/Trickbook.apk" 

debug: App not signed with debug cert. 

info: Building fast reset 

error: uncaughtException date=Thu May 30 2013 11:28:22 GMT+0530 (IST), pid=4466, uid=1000, gid=1000, cwd=/home/anuja, execPath=/usr/bin/nodejs, version=v0.10.8, argv=[node, /usr/bin/appium], rss=27017216, heapTotal=19666944, heapUsed=12400392, loadavg=[0.26318359375, 0.201171875, 0.333984375], uptime=2427.250582503, trace=[column=18, file=fs.js, function=Object.fs.openSync, line=427, method=fs.openSync, native=false, column=15, file=fs.js, function=Object.fs.readFileSync, line=284, method=fs.readFileSync, native=false, column=36, file=/usr/lib/node_modules/appium/android/adb.js, function=ADB.buildFastReset, line=131, method=buildFastReset, native=false, column=12, file=/usr/lib/node_modules/appium/android/adb.js, function=null, line=311, method=null, native=false, column=14, file=/usr/lib/node_modules/appium/android/adb.js, function=null, line=283, method=null, native=false, column=7, file=child_process.js, function=ChildProcess.exithandler, line=641, method=exithandler, native=false, column=17, file=events.js, function=ChildProcess.EventEmitter.emit, line=98, method=EventEmitter.emit, native=false, column=16, file=child_process.js, function=maybeClose, line=735, method=null, native=false, column=5, file=child_process.js, function=Process.ChildProcess._handle.onexit, line=802, method=ChildProcess._handle.onexit, native=false], stack=[Error: ENOENT, no such file or directory '/usr/lib/node_modules/appium/app/android/AndroidManifest.xml.src',  at Object.fs.openSync (fs.js:427:18),  at Object.fs.readFileSync (fs.js:284:15),  at ADB.buildFastReset (/usr/lib/node_modules/appium/android/adb.js:131:36),  at /usr/lib/node_modules/appium/android/adb.js:311:12,  at /usr/lib/node_modules/appium/android/adb.js:283:14,  at ChildProcess.exithandler (child_process.js:641:7),  at ChildProcess.EventEmitter.emit (events.js:98:17),  at maybeClose (child_process.js:735:16),  at Process.ChildProcess._handle.onexit (child_process.js:802:5)] 

哪裏我都執行了Python綁定腳本在終端上給出下面搞出來。

Traceback (most recent call last): 

    File "forth.py", line 12, in <module> 
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 

    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 72, in __init__ 
    self.start_session(desired_capabilities, browser_profile) 

    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 114, in start_session 
    'desiredCapabilities': desired_capabilities, 

    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 163, in execute 
    response = self.command_executor.execute(driver_command, params) 

    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 349, in execute 
    return self._request(url, method=command_info[0], data=data) 

    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 396, in _request 
    response = opener.open(request) 

    File "/usr/lib/python2.7/urllib2.py", line 400, in open 
    response = self._open(req, data) 

    File "/usr/lib/python2.7/urllib2.py", line 418, in _open 
    '_open', req) 

    File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain 
    result = func(*args) 

    File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 

    File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open 
    r = h.getresponse(buffering=True) 

    File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse 
    response.begin() 

    File "/usr/lib/python2.7/httplib.py", line 407, in begin 
    version, status, reason = self._read_status() 

    File "/usr/lib/python2.7/httplib.py", line 371, in _read_status 
    raise BadStatusLine(line) 

httplib.BadStatusLine: '' 

我已經使用了一個自簽名的apk用於上述測試目的。

  • 右鍵點擊Eclipse的Android項目
  • 的Android工具
  • 出口簽名的應用程序包
  • 去徹底嚮導

我使用的是真實的設備進行這種測試。

任何人都可以指出我在哪裏/我做了什麼錯?

回答

5

appium &啓動appium服務器。可以認爲這相當於啓動Selenium RC服務器的java -jar selenium.jar

一旦服務器啓動,你必須通過Python綁定連接到它:

from selenium import webdriver 

desired_caps = {} 
desired_caps['device'] = 'Android' 
desired_caps['browserName'] = '' 
desired_caps['version'] = '4.2' 
desired_caps['app'] = '/path/to.your.apk' 
desired_caps['app-package'] = 'com.example.android.package' 
desired_caps['app-activity'] = 'YourActivity' 
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 

一旦你連接,你可以控制通過正常的Python的webdriver命令測試。

例子:https://github.com/appium/sample-code/tree/master/sample-code/examples/python

+0

感謝您的回覆。在嘗試你的方法時我再次卡住了。根據你的回答我編輯了我的問題。請在水平線之後查看新的更新,並讓我知道我做錯了什麼/我做了什麼。 – AnujAroshA

0

從日誌,App not signed with debug cert.您的APK不是默認的調試證書在~/.android/debug.keystore

0

配置SDK簽署這樣

export ANDROID_HOME="$HOME/adt/sdk" 

export JAVA_HOME="/usr/bin/java" 

export PATH=${PATH}:~/adt/sdk/tools 

export PATH=${PATH}:~/adt/sdk/platform-tools 

代碼以供參考:

import os 
from time import sleep 
import unittest 
from appium import webdriver 

# Returns absolute path relative to this file and not cwd 
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)) 
class SimpleAndroidTests(unittest.TestCase): 
    def setUp(self): 
     desired_caps = {} 
     #Specify platform below(Android, iOS) 
     desired_caps['platformName'] = 'Android' 
     #Specify OS version(Settings->About phone -> android version) 
     desired_caps['platformVersion'] = '4.4.4' 
     #Obtain the Device name from Adb[For Android](Terminal Command: "adb devices") 
     desired_caps['deviceName'] = 'TA93304QZD' 
     #Specify the path to Application 
     desired_caps['app'] = PATH('Media Drive-com.sandisk.scotti-55-v2.0.3.apk') 
     self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 

    def tearDown(self): 
     # end the session 
     self.driver.quit() 

    def test_images_copy(self): 
     self.driver.implicitly_wait(5) 

     for i in range(0,4): 
       self.driver.find_element_by_id("com.sandisk.scotti:id/txt_Next").click() 
      self.driver.implicitly_wait(5) 
      self.driver.find_element_by_id("com.sandisk.scotti:id/txt_Close").click() 
     self.driver.implicitly_wait(5) 
     self.driver.find_element_by_name("OK").click() 
     self.driver.implicitly_wait(5) 
     self.driver.find_element_by_id("com.sandisk.scotti:id/txt_Photo").click() 
     self.driver.implicitly_wait(5) 
      self.driver.find_element_by_id("com.sandisk.scotti:id/btn_Switch_Local").click() 
     self.driver.implicitly_wait(5) 
       self.driver.find_element_by_id("com.sandisk.scotti:id/txt_Name").click() 
     self.driver.implicitly_wait(5) 

if __name__ == '__main__': 
    suite = unittest.TestLoader().loadTestsFromTestCase(SimpleAndroidTests) 
    unittest.TextTestRunner(verbosity=2).run(suite)