Python + Appium 自动化测试(二):实战

最近一直在忙比赛,从电赛到下个星期的省赛,这一个月真的过的好漫长....最后电赛只拿了省级的奖项,有点不甘心吧,但是还是有好多需要学习的地方,希望自己以后能够更好地面对这些挑战吧!!


一、连接手机

  • 通过USB线连接Android手机和电脑,打开手机的开发者模式,开启USB调试模式。

  • win+R打开cmd输入命令:adb devices,显示连接手机的udid即为连接成功:

Python + Appium 自动化测试(二):实战_第1张图片

二、获取测试手机及被测app的相应信息(即capability配置内容)

  • platformName:声明被测手机系统为ios或者为android

  • platformVersion:测试手机Android版本号。可以通过手机设置里面查看,也可以通过命令:

    adb shell getprop ro.build.version.release

 Python + Appium 自动化测试(二):实战_第2张图片

  • deviceName:测试手机的名称。可以通过手机设置里面查看,也可以通过命令:

    adb devices -l

 其中model为手机名称:

  • appPackage:即被测app包名

  • appActivity:即被测app的launcherActivity。通过命令:

adb shell dumpsys activity| findstr "mResume"

注意:要打开app才会出现结果,我测试的app为企业微信。

如果手机系统在Android 8.1以下,则需使用命令adb shell dumpsys activity | findstr “mFocus”查看。

三、appium启动app

Python + Appium 自动化测试(二):实战_第3张图片

 之后点击:

Python + Appium 自动化测试(二):实战_第4张图片

 将上面获取到的信息写入:

Python + Appium 自动化测试(二):实战_第5张图片

 之后它提示我的手机需要装: Appium settings、io.appium.uiautomator2.server  ,但是出现了这个bug

Python + Appium 自动化测试(二):实战_第6张图片

Appium 需要了解包和活动名称,以便正确初始化正在测试的应用程序。此信息预计将在驱动程序功能中提供,并包括以下密钥:

  • appActivity: 主要应用活动的名称

  • appPackage: 申请包的标识符

  • appWaitActivity: 等待/开始第一个申请活动的名称

  • appWaitPackage: 申请包的 ID 等待/开始第一个

  • appWaitDuration: 最长持续时间,直到集中在毫秒(默认情况下为 20000)appWaitActivity

  • appWaitForLaunch:是否等到活动经理将控制权返回呼叫过程。默认情况下,驱动程序始终等待到过期。设置此功能以有效地取消此等待,并在成功触发启动活动的命令后立即解锁服务器循环。

在网上查到的资料:我使用的是小米的手机,小秘密手机没有给appium权限,所以appium无法清除应用缓存。

可在代码中设置:

{
  "platformName": "Android",
  "platformVersion": "11",
  "deviceName": "M2012K11AC",
  "appPackage": " com.tencent.wework",
  "appActivity": ".launch.LaunchSplashEduActivity",
  "noReset": "True"
}

或者使用8.0以下的系统手机。

其他手机可以看看开发者模式中的usb调试权限、安全权限、模拟操作、OEM解锁是否开启。小米手机是仍需要设置的。

最后,解决了很久,原来是这么一个问题:

出现这种报错说无法打开:Original error: Cannot start the 'com.tencent.wework' application.

原因是在于我们的包名和界面名写错了,又排查了一大圈,其实自己的包名在adb中查找的时候并没有 写错,你需要在启动adb shell...的同时开启app启动界面!!!

之后就会出现如下界面:

Python + Appium 自动化测试(二):实战_第7张图片

 四、执行

我想实现的目标是:**做一个企业微信健康打卡机器人**

(1)首先要进行录制脚本:

Python + Appium 自动化测试(二):实战_第8张图片

模拟点击:

Python + Appium 自动化测试(二):实战_第9张图片

 之后生成的脚本如下:

Python + Appium 自动化测试(二):实战_第10张图片

当需要滑动时,只需要点击滑动按钮,即可向下滑动。

最后生成的代码如下:

el1 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout")
el1.click()
el2 = driver.find_element_by_id("com.tencent.wework:id/is3")
el2.click()
el3 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout[3]/android.widget.RelativeLayout")
el3.click()
el4 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[1]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.ImageView")
el4.click()
el5 = driver.find_element_by_id("com.tencent.wework:id/isa")
el5.click()
el6 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.FrameLayout/com.tencent.tbs.core.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View/android.view.View[1]/android.view.View[2]")
el6.click()
el7 = driver.find_element_by_id("com.tencent.wework:id/ish")
el7.click()
el8 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.ScrollView/android.widget.ListView/android.widget.RelativeLayout[9]")
el8.click()
TouchAction(driver)   .press(x=492, y=1489)   .move_t

 在pycharm中建立项目将代码粘入,在运行之前,还需通过pip命令安装pip install Appium-Python-Client依赖包。

如果有出现跟我类似的版本不兼容问题,则可以输入:

python -m pip install --upgrade pip

Python + Appium 自动化测试(二):实战_第11张图片

 之后就可以成功连接:

 打开软件PyCharm,输入以下代码:

from appium import webdriver

tests ={
    "platformName": "Android",
    "platformVersion": "11",
    "deviceName": "M2012K11AC",
    "appPackage": " com.tencent.wework",
    "appActivity": ".launch.LaunchSplashEduActivity",
    "noReset": "True"
}

driver = webdriver.Remote("http://localhost:4723/wd/hub", tests)

el1 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout")
el1.click()
el2 = driver.find_element_by_id("com.tencent.wework:id/is3")
el2.click()
el3 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout[3]/android.widget.RelativeLayout")
el3.click()
el4 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[1]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.ImageView")
el4.click()
el5 = driver.find_element_by_id("com.tencent.wework:id/isa")
el5.click()
el6 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.FrameLayout/com.tencent.tbs.core.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View/android.view.View[1]/android.view.View[2]")
el6.click()
el7 = driver.find_element_by_id("com.tencent.wework:id/ish")
el7.click()
el8 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.ScrollView/android.widget.ListView/android.widget.RelativeLayout[9]")
el8.click()
TouchAction(driver).press(x=492, y=1489).move_to(x=462, y=2180).release().perform()

TouchAction(driver).press(x=495, y=2190).move_to(x=605, y=884).release().perform()

TouchAction(driver).press(x=582, y=2207).move_to(x=645, y=758).release().perform()

TouchAction(driver).press(x=542, y=2207).move_to(x=628, y=854).release().perform()

TouchAction(driver).press(x=631, y=2236).move_to(x=691, y=1156).release().perform()

TouchAction(driver).press(x=618, y=2286).move_to(x=638, y=1263).release().perform()

TouchAction(driver).press(x=618, y=2233).move_to(x=645, y=1249).release().perform()

TouchAction(driver).press(x=648, y=2207).move_to(x=708, y=871).release().perform()

TouchAction(driver).press(x=582, y=2263).move_to(x=628, y=1196).release().perform()

TouchAction(driver).press(x=542, y=1947).move_to(x=555, y=1020).release().perform()

TouchAction(driver).press(x=957, y=1834).move_to(x=934, y=771).release().perform()

TouchAction(driver).press(x=834, y=1897).move_to(x=867, y=1093).release().perform()

el9 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[3]/android.widget.FrameLayout/com.tencent.tbs.core.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View/android.view.View/android.view.View[2]/android.view.View")
el9.click()
el10 = driver.find_element_by_id("com.tencent.wework:id/is3")
el10.click()

driver.quit()

 (2)粘贴后,我会出现一个报错:

from appium import webdriver  #此句报错

方法:file--Settings--Python Interpreter:

Python + Appium 自动化测试(二):实战_第12张图片

 原因是我们的软件中并没有Appium-Python-Client包。

Python + Appium 自动化测试(二):实战_第13张图片

之后它就不会报错啦。

在运行的过程中,我只实现了打开企业微信,却没有执行脚本,出错如下:

Traceback (most recent call last): File "E:/pythonProject/QYvx.py", line 16, in el1.click() File "E:\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click self.execute(Command.CLICK_ELEMENT) File "E:\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute return self.parent.execute(command, params) File "E:\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "E:\pythonProject\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 31, in check_response raise wde File "E:\pythonProject\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 26, in check_response super().check_response(response) File "E:\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: androidx.test.uiautomator.StaleObjectException

出现这个问题是因为,页面还没加载好就点击下一页了,就会报错。所以我们在cilk()后加入:driver.implicitly_wait(10)进行延时。

当再次运行时,我会出现如下错误:

E:/Python-Project/QYtest.py:17: DeprecationWarning: find_element_by* commands are deprecated. Please use find_element() instead el2 = driver.find_element_by_id("com.tencent.wework:id/is3") E:/Python-Project/QYtest.py:19: DeprecationWarning: find_element_by* commands are deprecated. Please use find_element() instead el3 = driver.find_element_by_xpath( Traceback (most recent call last): File "E:/Python-Project/QYtest.py", line 19, in el3 = driver.find_element_by_xpath( File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 514, in find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath) File "E:\Python-Project\venv\lib\site-packages\appium\webdriver\webdriver.py", line 405, in find_element return self.execute(RemoteCommand.FIND_ELEMENT, {'using': by, 'value': value})['value'] File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 418, in execute self.error_handler.check_response(response) File "E:\Python-Project\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 31, in check_response raise wde File "E:\Python-Project\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 26, in check_response super().check_response(response) File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 243, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

我运行以上代码,当我打开企业微信,并且可以执行到第二步时,它就报错了,原因是因为:

DeprecationWarning: find_element_by_*命令已弃用。 请使用find_element() el1 = driver.find_element_by_xpath (

安装的时候安装了4.0.0版本,我们需要将他更替为3.0版本:

Python + Appium 自动化测试(二):实战_第14张图片

打开pycharm-->file-->settings-->python interpreter中选中selenium,点击【-】移除。

之后win+R打开:

  1. 卸载当前的selenium:

    pip uninstall selenium

  2. 安装3.141.0版本的selenium:

    pip install selenium==3.3.1

Python + Appium 自动化测试(二):实战_第15张图片

 回到pycharm点击【+】,下载3.0版本的selenium:

Python + Appium 自动化测试(二):实战_第16张图片

 

解决完以上问题后继续运行调试:

> Traceback (most recent call last):
> File "E:/Python-Project/QYtest.py", line 16, in
>  el1.click()
> File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
>  self._execute(Command.CLICK_ELEMENT)
> File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
>  return self._parent.execute(command, params)
> File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
>  self.error_handler.check_response(response)
> File "E:\Python-Project\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 31, in check_response
>  raise wde
> File "E:\Python-Project\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 26, in check_response
>  super().check_response(response)
> File "E:\Python-Project\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
>  raise exception_class(message, screen, stacktrace)
> selenium.common.exceptions.StaleElementReferenceException: Message: androidx.test.uiautomator.StaleObjectException

会出现如上的报错,确实太坎坷了T T....

我试着重新一步一步地打开我所需要的页面,我发现是它从第一步开始就找不到我的元素:

selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

找不到元素的原因就是页面响应得太慢了,我们需要**延时延时再延时**,让它等到他刷新好的那个时间才能够找到对应的元素!!

最后成功的代码如下:

 

from appium import webdriver
import time

from appium.webdriver.common.touch_action import TouchAction

tests = {
    "platformName": "Android",
    "platformVersion": "11",
    "deviceName": "M2012K11AC",
    "appPackage": " com.tencent.wework",
    "appActivity": ".launch.LaunchSplashEduActivity",
    "noReset": "True"
}

driver = webdriver.Remote("http://localhost:4723/wd/hub", tests)

time.sleep(3)
# 工作台
el3 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget"
    ".LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget"
    ".LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout[3]/android.widget.RelativeLayout")
el3.click()
# 健康上报
el4 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget"
    ".LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget"
    ".FrameLayout[2]/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView"
    "/android.widget.RelativeLayout[1]/android.widget.LinearLayout")
el4.click()
time.sleep(20)
# 健康填报(未填报状态)
el5 = driver.find_element_by_xpath(
    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget"
    ".LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout["
    "2]/android.widget.FrameLayout/com.tencent.tbs.core.webkit.WebView/android.webkit.WebView/android.view.View"
    "/android.view.View/android.view.View[1]/android.view.View[2]")
el5.click()
time.sleep(6)

# 滑动页面
TouchAction(driver).press(x=495, y=2173).move_to(x=601, y=831).release().perform()

TouchAction(driver).press(x=472, y=2153).move_to(x=555, y=1160).release().perform()

TouchAction(driver).press(x=469, y=2230).move_to(x=515, y=1024).release().perform()

TouchAction(driver).press(x=585, y=2293).move_to(x=605, y=1216).release().perform()

TouchAction(driver).press(x=595, y=2290).move_to(x=651, y=1259).release().perform()

TouchAction(driver).press(x=545, y=2250).move_to(x=578, y=1203).release().perform()

TouchAction(driver).press(x=512, y=2163).move_to(x=611, y=851).release().perform()

TouchAction(driver).press(x=515, y=2120).move_to(x=532, y=794).release().perform()

TouchAction(driver).press(x=578, y=2240).move_to(x=535, y=954).release().perform()

TouchAction(driver).press(x=485, y=2223).move_to(x=658, y=1030).release().perform()

el6 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget"
                                   ".FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android"
                                   ".widget.RelativeLayout/android.widget.RelativeLayout["
                                   "3]/android.widget.FrameLayout/com.tencent.tbs.core.webkit.WebView/android.webkit"
                                   ".WebView/android.view.View/android.view.View/android.view.View/android.view.View["
                                   "2]/android.view.View "
                                   )
el6.click()

你可能感兴趣的:(python,自动化,pycharm,android,app)