一:问题详情描述
1:Pycharm报错详情
An unknown server-side error occurred while processing the command. Original error: Could not find a connected Android device in 20088ms.
2:代码
下面展示一些 内联代码片
。
from time import sleep
from appium import webdriver
desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "9"
desired_caps["deviceName"] = "192.168.56.101:5555"
desired_caps["appPackage"] = "com.android.settings"
desired_caps["appActivity"] = ".Settings"
desired_caps["noReset"] = True
desired_caps["unicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
3:Appium服务端日志信息
4:android手机版本
二:解决方案
因为刚开始做测试遇到的问题,不太了解appium的架构和脚本运行流程,出现了此问题在网上寻找解决办法大都相似但不相同,花费了很多时间也没找到解决方案,后面了解了appium架构原理才理出了一点头绪。希望能帮到遇到同样问题的伙伴。
1 :相关知识点
Appium架构原理:
原理图如图(2-1)
(1)Appium服务器的主要功能是接受从Appium客户端发起的连接,监听从客户端发送来的命令,将命令发送给
bootstrap.jar(iOS手机为bootstrap.js)执行,并将命令的执行结果通过HTTP应答反馈给Appium客户端。
(2)Appium客户端。它主要是指实现了Appium功能的WebDriver协议的客户端Library,它负责与Appium服务器建立连接,并将测试脚本的指令发
送到Appium服务器。
(3)bootstrap.jar是在Android手机上运行的一个应用程序,它在手机上扮演TCP服务器的角色。当Appium服务器需要运行命令时,Appium服务器会与bootstrap.jar建立TCP通信,并把命令发送给bootstrap.jar;bootstrap.jar负责运行测试命令。
(4)Session。Appium的客户端和服务端之间进行通信都必须在一个Session的上下文中进行。客户端在发起通信的时候首先会发送一个叫作“Desired Capabilities”的JSON对象给服务器。服务器收到该数据后,会创建一个session并将session的ID返回到客户端。之后客户端可以用该session的
ID发送后续的命令。
(5)Desired Capabilities。Desired Capabilities是一组设置的键值对的集合,其中键对应设置的名称,而值对应设置的值。Desired Capabilities主要用于通知Appium服务器建立需要的Session,其中一些设置可以在Appium运行过程中改变Appium服务器的运行行为。
脚本的运行流程:
比如脚本上的一个点击操作,在Appium服务器上都是touch指令,当指令发送到Android系统上时,Android系统上的bootstrap.jar将调用UIAutomator的方法实现点击操作;而当指令发送到iOS系统上时,iOS的Bootstrap.js将调用UIAutomation的方法实现点击操作。
原理图(2-1)
2:错误日志提示
一定要往上翻查看日志详情,只看错误末尾啥信息也看不出来
我的Appium服务端日志错误信息如下图:
这个说明HTTP连接建立成功,问题出在TCP连接上或者bootstrap.jar上或者uiautomator上
这个提示少安装了一个io.appium.uiautomator2.server
那么这个是什么呢?
在Appium架构原理已经过,Bootstrap.jar调用UIAutomator的方法实现点击操作,那么没有找到就出错。UIAutomator是自动安装的,在你运行客户端脚本时会自动在android手机上安装,查看可以在手机设置-》应用 里面查看已经安装的3个安装包,AppiumSettings、uiautomator1、uiautomator2。这个包安装可能需要几次,不成功可以清除数据卸载掉,再重新运行脚本。我这个只安装成功两个包AppiumSettings和uiautomator2。可以正常使用,因为1和2只是版本不同,然后在脚本里添加一行代码,再来运行一次
from time import sleep
from appium import webdriver
desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "7.1.2"
desired_caps["automationName"] = "uiautomator1"
desired_caps["deviceName"] = "127.0.0.1:62025"
desired_caps["appPackage"] = "com.android.settings"
desired_caps["appActivity"] = ".Settings"
desired_caps["noReset"] = True
desired_caps["unicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
print("执行sleep之前")
sleep(3)