公司同事學習自動化新裝環境后,run多進程測試用例時出錯:
multiprocessing.pool.MaybeEncodingError: Error sending result: ’<appium.webdriver.webdriver.WebDriver (session=“261019ae-3776-4a78-aa2c-b24bb64ec62e”)>’. Reason: ’AttributeError(“Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘“)’
同一份代碼,我本地並沒有這種情況
在網上搜索到三種方法:
1.用線程替換進程
2.可以使用copy_reg來規避上面的異常.
3.dill 或pathos.multiprocesssing :use 'import pathos.multiprocesssing', instead of 'import multiprocessing'. pathos.multiprocessing is a fork of multiprocessing that uses dill. dill can serialize almost anything in python, so you are able to send a lot more around in parallel.
最開始采用了方法3:use 'import pathos.multiprocesssing', instead of 'import multiprocessing' ,然后程序並不在拋出該錯誤,但是啟動case后,appium啟動driver后便不在干活(使用兩個進程分別在不同端口啟動driver),appium log沒有錯誤,pycharm也一直轉轉轉卡在那不去執行find element, 所以還是還原到使用import multiprocessing
最終解決方案如下:
1. mac裡面的python都刪乾淨
2. 用pyenv裝python 3.5.2
3. 執行multi process case script
4. 把該裝的selenium, Pillow, requests裝一裝
5. 最後一步降級appium-python-client : pip install appium-python-client==0.25 (這個是重點,可以忽略其他步驟直接降級版本,這里是因為需要才重裝, 當然筆者local的0.31版本也可以的,就是最新版(0.43)有問題)
6. 成功!