UiAutomator exited unexpectedly with code 0, signal null
来源:5-14 多进程、unittest、HTMLTestRunner、启动服务流程梳理代码重构

qq_毅笑而过_0
2020-03-10
问题:
使用多进程,Android driver还是会被shut down。
环境:
Appium: v1.16.0
Android Device:4.4.2 (没办法,公司真机环境只能使用这个版本)
Android driver: 4.25.2
基于老师的代码,已经尝试做的修改:
- 把Server启动的主函数也改成了进程,而不是线程。
- 因公司的app启动后,需要等待机械部分的初始化,所以app启动后需要等待较久时间,BaseDriver的封装,capability增加了"newCommandTimeout" : 2000, 后来改到5000也一样。
- 因我们使用2个apk,一个管UI,一个主程序,尝试capability里把"appActivity" 改为"app",“otherApps”。
- 麻烦老师帮忙看下
base_driver
import time
from appium import webdriver
from util.write_user_command import WriteUserCommand
class BaseDriver:
def android_driver(self,i):
print ('This is android_driver:',i)
#devices_name adb devices
#port
write_file = WriteUserCommand()
devices = write_file.get_value('user_info_'+str(i),'deviceName')
port = write_file.get_value('user_info_'+str(i),'port')
capabilities = {
"platformName": "Android",
"automationName":"UiAutomator1",
"deviceName": devices,
"noReset":True,
"platformVersion":"4.4.2",
# "appPackage" : "com.incomrecycle.prms.rvm",
# "appActivity" : ".RVMActivity",
"app": "../app/H3V19.201812b01_international_RVMApp.apk",
# Better to use absolute path for otherApps
"otherApps" : "../app/H3V19.201812b01_international_UIApp.apk",
# "appWaitActivity":"com.incomrecycle.prms.ui.RVMActivity"
"newCommandTimeout" : 5000,
# "androidDeviceReadyTimeout" : 50
}
driver = webdriver.Remote("http://127.0.0.1:"+port+"/wd/hub",capabilities)
# print("Driver created succesfully, waiting 50 sec.")
# time.sleep(55)
return driver
server
from util.dos_cmd import DosCmd
from util.port import Port
import threading
import multiprocessing
import time
from util.write_user_command import WriteUserCommand
class Server:
def __init__(self):
self.dos = DosCmd()
self.device_list = self.get_devices()
self.write_file = WriteUserCommand()
def get_devices(self):
'''
获取设备信息
'''
devices_list = []
result_list = self.dos.excute_cmd_result('adb devices')
if len(result_list)>=2:
for i in result_list:
if 'List' in i:
continue
devices_info = i.split(' ')
if devices_info[1] == 'device':
devices_list.append(devices_info[0])
return devices_list
else:
return None
def create_port_list(self,start_port):
'''
创建可用端口
'''
port = Port()
port_list = []
port_list = port.create_port_list(start_port,self.device_list)
return port_list
def create_command_list(self,i):
'''
生成命令
'''
#appium -p 4700 -bp 4701 -U 127.0.0.1:21503
command_list = []
appium_port_list = self.create_port_list(4700)
bootstrap_port_list = self.create_port_list(4900)
device_list = self.device_list
command = "appium -p "+str(appium_port_list[i])+" -bp "+str(bootstrap_port_list[i])+" -U "+device_list[i]+" --no-reset --session-override --log ../log/test02.log"
#appium -p 4723 -bp 4726 -U 127.0.0.1:62001 --no-reset --session-override --log E:/Teacher/Imooc/AppiumPython/log/test01.log
command_list.append(command)
self.write_file.write_data(i,device_list[i],str(bootstrap_port_list[i]),str(appium_port_list[i]))
return command_list
def start_server(self,i):
'''
启动服务
'''
self.start_list = self.create_command_list(i)
print (self.start_list)
self.dos.excute_cmd(self.start_list[0])
def kill_server(self):
server_list = self.dos.excute_cmd_result('tasklist | find "node.exe"')
if len(server_list)>0:
self.dos.excute_cmd('taskkill -F -PID node.exe')
def main(self):
# thread_list = []
process_list = []
self.kill_server()
self.write_file.clear_data()
for i in range(len(self.device_list)):
# appium_start = threading.Thread(target=self.start_server,args=(i,))
# thread_list.append(appium_start)
appium_start = multiprocessing.Process(target=self.start_server,args=(i,))
process_list.append(appium_start)
# for j in thread_list:
for j in process_list:
j.start()
time.sleep(20)
if __name__ == '__main__':
server = Server()
print (server.main())
test_case
import sys
sys.path.append("C:/Users/Stefanl/eclipse-workspace/H30stdTest")
import unittest
import HTMLTestRunner
import threading
import multiprocessing
from util.server import Server
import time
from appium import webdriver
from business.login_business import LoginBusiness
from util.write_user_command import WriteUserCommand
class ParameTestCase(unittest.TestCase):
def __init__(self,methodName='runTest',parame=None):
super(ParameTestCase,self).__init__(methodName)
global parames
parames = parame
class CaseTest(ParameTestCase):
@classmethod
def setUpClass(cls):
print ("setUpclass---->",parames)
cls.login_business = LoginBusiness(parames)
def setUp(self):
print ("this is setup
")
def test_01(self):
print ("test case 里面的参数",parames)
print('This is test case 01')
self.assertTrue(True)
self.login_business.login_pass()
#self.assertNotEqual(1,2)
#self.assertTrue(flag)
#self.assertFalse(flag)
@unittest.skip("CaseTest")
def test_02(self):
self.login_business.login_user_error()
print ("this is case02
")
self.assertTrue(True)
def tearDown(self):
time.sleep(1)
print ("this is teardown
")
if sys.exc_info()[0]:
self.login_business.login_handle.login_page.driver.save_screenshot("../jpg/test02.png")
@classmethod
def tearDownClass(cls):
time.sleep(1)
print ("this is class teardown
")
#cls.driver.quit()
def appium_init():
server = Server()
server.main()
def get_suite(i):
print ("get_suite里面的",i)
suite = unittest.TestSuite()
# suite.addTest(CaseTest("test_02",parame=i))
suite.addTest(CaseTest("test_01",parame=i))
#unittest.TextTestRunner().run(suite)
html_file = "../report/report"+str(i)+".html"
fp = open(html_file,"wb")
HTMLTestRunner.HTMLTestRunner(stream=fp).run(suite)
# fp.close()
def get_count():
write_user_file = WriteUserCommand()
count = write_user_file.get_file_lines()
return count
if __name__ == '__main__':
appium_init()
#get_suite(0)
# threads = []
for i in range(get_count()):
print (i)
t = multiprocessing.Process(target=get_suite,args=(i,))
t.start()
# 等待进程执行完毕
# t.join()
# threads.append(t)
# for j in threads:
# j.start()
time.sleep(3)
# time.sleep(80)
log
链接:https://pan.baidu.com/s/1Yq_L_GfpcHrJfgfgShVQxQ
提取码:dny7
写回答
3回答
-
qq_毅笑而过_0
提问者
2020-03-10
这个问题可以忽略了,已经解决了。
之前调试改了好多地方,忘记改回去导致的。
012020-03-11 -
qq_毅笑而过_0
提问者
2020-03-10
对比用多进程方式启动,和直接在unittest里创建driver的方法进行,发现问题似乎在于session还是被kill掉了。
以下是多进程的:
这个是直接在unittest里创建driver的:
所以还是进程的写法有问题吗?
00 -
qq_毅笑而过_0
提问者
2020-03-10
看了网上其他的解决办法,无法解决。
00
相似问题