准備工作
升級Python版本
Centos7中自帶的Python版本是2.7.5,app自動化是用Python3寫的,因此需要升級Centos7的Python版本
# 切換工作目錄到/opt
cd /opt
# 下載目標Python版本的壓縮包
wget http://npm.taobao.org/mirrors/python/3.8.0/Python-3.8.0.tgz
# 安裝解壓命令unzip
pip install -y unzip
# 解壓壓縮包
tar -zxvf Python-3.8.0.tgz
# 安裝libffi-devel tk-devel,否則編譯和pip install過程中會報ModuleNotFoundError: No module named '_ctypes'的錯誤
yum -y install libffi-devel tk-devel
# 安裝gcc,否則編譯時會報錯
yum -y install gcc
# 切換到Python-3.8.0目錄
cd Python-3.8.0
# 生配置
# 注意這里要加上--prefix能好點。如果不加,安裝后的可執行文件默認放在/usr/local/bin
# 庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc,其他資源默認放在
# /usr/local/share。比較雜亂。如果加上,會把所有的資源文件都放在指定路徑下,卸載
# 時,只需要刪除該目錄即可
./configure --prefix=/opt/Python-3.8.0
# 編譯安裝
make && make install
# 創建軟鏈接:創建后輸入python3就可以進入到python3的環境
ln -s /opt/Python-3.8.0/bin/python3 /usr/bin/python3
# 配置環境變量
vim /etc/profile
在PATH后加上::$PATH:/opt/Python-3.8.0/bin
source /etc/profile
pip配置國內源
為了提高pip安裝速度,將pip配置為國內鏡像源
# 在家目錄下創建.pip目錄
cd ~
mkdir .pip
# 切換到pip目錄並創建pip.conf文件
cd .pip
touch pip.conf
#編輯pip.conf,輸入以下內容保存
vim pip.conf
[global]
timeout = 100
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com
# 升級pip
pip3 install --upgrade pip
安裝依賴庫
在本地項目根目錄下的命令行中,使用pip freeze將依賴庫信息信息輸出到requirement.txt文件
pip freeze >requirements.txt
然后將項目壓縮成zip包,通過rz命令上傳到Centos7的/work_shop目錄下,然后解壓
接着進入到項目目錄下,安裝依賴庫
啟動容器
在上次已經啟動了一個4723端口的appium容器,現在再手動啟動一個4725的appium容器,名字命名為appium_2
docker run --privileged -d -p 4725:4725 --name appium_2 appium/appium
模擬器設置
利用夜神多開器啟動另一個安卓5.1.1的模擬器,設置橋接,靜態ip為192.168.0.104
然后設置模擬器的連接方式為tcpip連接
C:\Users\beck
λ adb cdevices
List of devices attached
127.0.0.1:62025 device #安卓7
127.0.0.1:62001 device #安卓5
C:\Users\beck
λ adb c-s 127.0.0.1:62001 tcpip 5555
restarting in TCP mode port: 5555
docker連接模擬器
docker exec -it appium_1 adb connect 192.168.0.102:6666
docker exec -it appium_2 adb connect 192.168.0.104:5555
如果能看到這樣的輸出說明已經都連接上了
修改python代碼
修改main.py
main.py里主要是修改device_infos中的信息,比如加入了docker_name,以便BaseDriver初始化時使用它,device_ip是模擬器橋接后得到的靜態ip,device_port是給模擬器設置的tcp端口號
import pytest, os
import time
from common.conf_dir import root_dir, logs_dir, html_reports_dir
from multiprocessing import Pool
from clean import *
device_infos = [{"docker_name": "appium_1", "platform_version": "7.1.2", "device_ip":"192.168.0.102", "device_port": 6666, "server_port": 4723, "system_port": 8200},
{"docker_name": "appium_2", "platform_version": "5.1.1", "device_ip":"192.168.0.104", "device_port": 5555, "server_port": 4725, "system_port": 8201}]
cur_time = time.strftime("%Y-%m-%d_%H-%M-%S")
def run_parallel(device_info):
pytest.main([
f"--cmdopt={device_info}",
#"--reruns=1",
#"--reruns-delay=10",
"-m", "fail",
"--junitxml", f"{html_reports_dir}/autotest_report_{cur_time}.xml",
"--html", f"{html_reports_dir}/autotest_report_{cur_time}.html",
"--css", f"{html_reports_dir}/assets/style.css",
"--self-contained-html"])
if __name__ == "__main__":
with Pool(2) as pool:
pool.map(run_parallel, device_infos)
pool.close()
pool.join()
修改base_driver.py
在BaseDriver.py的初始化方法__init__中加入cmd和os.system(cmd),注意不能使用docker logs -f appium_1,因為輸出appium server實時日志時,后面的代碼就一直卡在那里,所以使用docker appium_1這種方式
from appium import webdriver
from .conf_dir import caps_dir
import yaml
import os
class BaseDriver:
def __init__(self, device_info):
self.device_info = device_info
cmd = f"docker {self.device_info['docker_name']}"
os.system(cmd)
def base_driver(self, automationName="appium"):
fs = open(f"{caps_dir}//caps.yml")
#平台名稱、包名、Activity名稱、超時時間、是否重置、server_ip、
desired_caps = yaml.load(fs, Loader=yaml.FullLoader)
#版本信息
desired_caps["platform_version"] = self.device_info["platform_version"]
#設備名稱
desired_caps["deviceName"] = f"{self.device_info['device_ip']}:{self.device_info['device_port']}"
#系統端口號
desired_caps["systemPort"] = self.device_info["system_port"]
if automationName != "appium":
desired_caps["automationName"] = automationName
driver = webdriver.Remote(f"http://127.0.0.1:{self.device_info['server_port']}/wd/hub", desired_capabilities=desired_caps)
return driver
運行
切換到/workshop/APP_AutoTest目錄后,使用python3運行main.py
python3 main.py
測試報告
右下角是我們添加的失敗用例的截圖,這個報告比較簡陋,后面會使用allure優化
源碼下載
git clone https://github.com/cnhkzyy/appium-app-test.git
git checkout version11.0
參考文章
《CentOS7 下升級Python版本》
《在centos上配置Python pip國內鏡像源》
《安裝python3.7出現ModuleNotFoundError: No module named '_ctypes'解決辦法》
《「docker實戰篇」python的docker-創建appium容器以及設置appium容器連接安卓模擬器(31)》
《docker 部署appium》