框架:appium+python+unittest
安卓手机:真机,安卓8.0
appium版本:1.4
问题描述:成功连接手机,开启appium server后,执行testsuit.py主程序时,不执行用例程序,appium控制台有报错信息(函数未定义)。
pycharm控制台信息如下:
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
E test_login_in (loginIn_testcase.Test_Login)
Time Elapsed: 0:10:00.024448
appium控制台有报错信息:
> info: Starting App
> info: [debug] Attempting to kill all 'uiautomator' processes
> info: [debug] Getting all processes with 'uiautomator'
> error: Unhandled error: TypeError: undefined is not a function
> at [object Object].ADB.getPIDsByName (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:1037:8)
> at [object Object].ADB.killProcessesByName (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:1079:8)
> at [object Object].UiAutomator.start (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\uiautomator.js:29:12)
> at [object Object].<anonymous> (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\android.js:115:37)
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:607:21
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:246:17
> at iterate (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:146:13)
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:157:25
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:248:21
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:612:34
> at [object Object].androidCommon.initUnicode (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\android-common.js:878:5)
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:607:21
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:246:17
> at iterate (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:146:13)
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:157:25
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:248:21
> at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:612:34
> at [object Object].<anonymous> (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:180:9)
> at ChildProcess.exithandler (child_process.js:742:7)
> at ChildProcess.emit (events.js:110:17)
> at maybeClose (child_process.js:1016:16)
> at Process.ChildProcess._handle.onexit (child_process.js:1088:5) context: [POST /wd/hub/session {"capabilities":{"firstMatch":[{}],"alwaysMatch":{"platformName":"Android","appium:platformVersion":"5.0","appium:deviceName":"NPE4C17302001740","appium:appPackage":"com.njzx.care","appium:appActivity]
testreport中错误为:
Traceback (most recent call last): File "E:\pycharm\run\SHB_Test\loginIn_testcase.py", line 32, in setUp driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 打开app 127.0.0.1是环回(loopback)地址 File "D:\python\lib\site-packages\appium\webdriver\webdriver.py", line 97, in __init__ super(WebDriver, self).__init__(command_executor, desired_capabilities, browser_profile, proxy, keep_alive) File "D:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__ self.start_session(capabilities, browser_profile) File "D:\python\lib\site-packages\appium\webdriver\webdriver.py", line 136, in start_session response = self.execute(RemoteCommand.NEW_SESSION, parameters) File "D:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute response = self.command_executor.execute(driver_command, params) File "D:\python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 376, in execute return self._request(command_info[0], url, body=data) File "D:\python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 404, in _request resp = http.request(method, url, body=body, headers=headers) File "D:\python\lib\site-packages\urllib3\request.py", line 72, in request **urlopen_kw) File "D:\python\lib\site-packages\urllib3\request.py", line 150, in request_encode_body return self.urlopen(method, url, **extra_kw) File "D:\python\lib\site-packages\urllib3\poolmanager.py", line 323, in urlopen response = conn.urlopen(method, u.request_uri, **kw) File "D:\python\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen _stacktrace=sys.exc_info()[2]) File "D:\python\lib\site-packages\urllib3\util\retry.py", line 367, in increment raise six.reraise(type(error), error, _stacktrace) File "D:\python\lib\site-packages\urllib3\packages\six.py", line 685, in reraise raise value.with_traceback(tb) File "D:\python\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen chunked=chunked) File "D:\python\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request six.raise_from(e, None) File "<string>", line 2, in raise_from File "D:\python\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request httplib_response = conn.getresponse() File "D:\python\lib\http\client.py", line 1331, in getresponse response.begin() File "D:\python\lib\http\client.py", line 297, in begin version, status, reason = self._read_status() File "D:\python\lib\http\client.py", line 266, in _read_status raise RemoteDisconnected("Remote end closed connection without" urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
脚本如下:
测试用例文件loginIn_testcase.py
# -*- coding:utf-8 -*- import unittest import os import time from appium import webdriver # 导入appium库 from selenium.common.exceptions import NoSuchElementException # 测试用例1: # 安卓应用名:守护宝 # 包名和activity名:com.njzx.care/com.njzx.care.activity.WelcomeActivity2 # 测试步骤: # (1)打开apk # (2)关爱界面点击“您好,请登录”,界面跳转至登录/注册界面 # (3)直接输入号码:15152660926 密码:111111 # (4)点击登录---成功 class Test_Login(unittest.TestCase): def setUp(self): # 准备环境 # PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) # 不写这一句也OK desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '5.0' desired_caps['deviceName'] = 'NPE4C17302001740:5037' # desired_caps['app'] = PATH('D:/workspace/testUI_new/app/test.apk') desired_caps['appPackage'] = 'com.njzx.care' desired_caps['appActivity'] = 'com.njzx.care.activity.WelcomeActivity2' # desired_caps["unicodeKeyboard", "True"] # 支持中文输入 # desired_caps["resetKeyboard", "True"] # 支持中文输入,必须两条都配置 desired_caps['newCommandTimeout'] = '100' # 超时时间 desired_caps['automationName'] = 'uiautomator2' # desired_caps['app'] = 'apk包存放地址' driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 打开app 127.0.0.1是环回(loopback)地址 time.sleep(5) self.driver = driver print("环境准备完成!") self.verificationErrors = "----------------------------------------!" # 测试用例 def test_login_in(self): # 用例名必须以test_开头 time.sleep(5) title = self.driver.find_element_by_text("您好,请登录") title.click() time.sleep(2) user = self.driver.find_element_by_text("请输入手机号码") if user.exists(): user.click() time.sleep(2) user_tel = input("请输入手机账号") user.send_keys(user_tel) else: print('user元素未获取得到') pwd = self.driver.find_element_by_text("请输入登录密码") if pwd.exists(): pwd.click() time.sleep(2) pwd_tel = input("请输入密码") pwd.send_keys(pwd_tel) else: print('pwd元素未获取得到') # 点击登录 try: submit_login = self.driver.find_element_by_id("com.njzx.care:id/iv_login") except (NoSuchElementException,Exception) as d: print("登录失败!", format(d)) else: submit_login.click() time.sleep(2) def tearDown(self): self.drvier.quit() print("环境还原完成!")
测试集(主程序)文件testsuit.py:
# encoding:utf-8
import unittest
from loginIn_testcase import Test_Login
from HTMLTestRunner import HTMLTestRunner
# 用例集合
if __name__ == '__main__':
suite = unittest.TestSuite() # unittest模块中的TestSuite()创建一个对象接收testcase
suite.addTests(unittest.TestLoader().loadTestsFromNames(['loginIn_testcase.Test_Login']))# 传入测试用例(文件名 + 类名)
with open('E:/pycharm/run/SHB_Test/result_report/HTMLReport.html', 'wb') as f:# 模式wb
runner = HTMLTestRunner(stream=f,
title=' Test Report',
description='generated by HTMLTestRunner----Bling',
verbosity=2
)
runner.run(suite)