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

基于老师的代码,已经尝试做的修改:

  1. 把Server启动的主函数也改成了进程,而不是线程。
  2. 因公司的app启动后,需要等待机械部分的初始化,所以app启动后需要等待较久时间,BaseDriver的封装,capability增加了"newCommandTimeout" : 2000, 后来改到5000也一样。
  3. 因我们使用2个apk,一个管UI,一个主程序,尝试capability里把"appActivity" 改为"app",“otherApps”。
  4. 麻烦老师帮忙看下

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

写回答

3回答

qq_毅笑而过_0

提问者

2020-03-10

这个问题可以忽略了,已经解决了。

之前调试改了好多地方,忘记改回去导致的。

0
1
Mushishi
不错不错,加油。
2020-03-11
共1条回复

qq_毅笑而过_0

提问者

2020-03-10

对比用多进程方式启动,和直接在unittest里创建driver的方法进行,发现问题似乎在于session还是被kill掉了。

以下是多进程的:

//img1.sycdn.imooc.com/szimg/5e6751fa09de195f18240714.jpg

这个是直接在unittest里创建driver的:

//img1.sycdn.imooc.com/szimg/5e6752260913a3bf18230306.jpg

所以还是进程的写法有问题吗?

0
0

qq_毅笑而过_0

提问者

2020-03-10

看了网上其他的解决办法,无法解决。

//img1.sycdn.imooc.com/szimg/5e67226809b6e22805350457.jpg

0
0

Python主讲移动端自动化测试框架Appium

APP自动化基础知识、po模型、关键字模型、服务自动化、持续集成

1508 学习 · 1333 问题

查看课程