一、Appium环境到基础函数的封装

一、课程目标及课程规划

1、目标:

(1)开发2个移动端一键自动化测试框架

(2)开发1个appium自动化服务

2、课程安排:

(1)第一章 appium环境到基础函数的封装

(2)第二章 PO模型设计

(3)第三章 Unitest的使用

(4)第四章 appium服务介绍

(5)第五章 一键自动化从设计到实战

(6)第六章 关键字模型从设计到实战

(7)第七章 持续集成讲解

(8)第八章 查漏补缺

(9)第九章 IOS下Appium自动化测试

3、Appium基础:

(1)Appium环境搭建

(2)Appium基础使用

(3)常见定位方式

(4)基本函数封装

4、PO模型、关键字驱动、一键自动化

5、移动自动化测试框架从设计到开发

(1)设计服务端

(2)工具类开发

(3)服务端开发

(4)多机并行

(5)基类封装

(6)调试错误

6、关键字模型从设计到开发

关键字模型设计、操作类设计封装、关键字模型实现、流程梳理

实现持续集成

二、Appium简介及工作原理

1、为什么要选择Appium做移动自动化?

Appium是开源、跨平台

2、做什么?

Ios和Android、H5自动化

3、Android自动化工作原理?

电脑编写测试脚本(test scripts)和Appium server服务创建通讯,appium server服务调用UIAutomator接口(android4.2以上(包括4.2)),UIAutomator在apk上执行自动化脚本,执行完后结果返回给appium server,再返回到客户端(电脑)。

给运行手机app,再通过UIAutomator返回给appium server,通过appium

4、Ios自动化工作原理?

电脑编写测试脚本(test scripts)和Appium server服务创建通讯,appium server服务调用instruments接口,instruments英 [ˈɪnstrʊmənts]在apk上执行自动化脚本(必须装上xcode,mac系统),执行完后结果返回给appium server,再返回到客户端。

 

三、Appium环境的搭建

1、整体流程:        依赖关系

        脚本                ———            python

          |

Appium Server        ———           Appium

          |

UiAutomator           ———           Android SDK(谷歌公布的)

          |

   手机执行              ———          手机/模拟器

2、                  依赖关系

Appium            ———            Node.js

AndroidSDK    ———               jdk

3、appium 与python的连接关系:Appium-Python-Client(API方法)

4、需要安装和配置的图片

5、JDK安装

环境变量的配置:计算机——高级系统设置——高级——环境变量——系统变量

(1)新建:

变量名:JAVAV_HOME

变量值:D:\java\jdk   (jdk安装路径)

(2)变量名:path中添加

变量值:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

(3)变量名:CLASSPATH添加:

;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;

检查jdk配置:win+R 输入cmd,命令行输入java

6、SDK安装(jdk的上层)

https://www.cnblogs.com/nebie/p/9145627.html

(1)新建:

变量名:ANDROID_HOME

变量值:D:\java\sdk

(2)变量名:path中添加

变量值:%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;

验证sdk:win+R 输入cmd录入adb

7、Nodes.js安装

官网下载安装即可,按照步骤下一步

https://nodejs.org/en/download/

8、Appium安装

官网下载

9、下载python和Appium-Python-Client(API方法)

(1)python和python编辑器pycharm安装

Python:下载如图

在windows中配置环境变量

path:D:\Python\Python37\Scripts\;D:\Python\Python37\;

PyCharm 下载地址 : https://www.jetbrains.com/pycharm/download/

PyCharm 安装地址:http://www.runoob.com/w3cnote/pycharm-windows-install.html

professional 表示专业版,community 是社区版,推荐安装社区版,因为是免费使用的。

(2)https://pypi.org/project/Appium-Python-Client/#files   安装Appium-Python-Client

下载的压缩包解压后,当前解压目录下,安装:录入: python setup.py  install,安装成功如图

四、Appium的运行

1、启动安装的Appium server,直接点击“start server”启动appium-desktop,出现如图:点击“Start inspector Session”图标

进入sever配置页面,按照对应的“参数名-值”配置相应的参数,

appPackage和appActivity可以通过在命令提示符中输入“adb shell dumpsys window w |findstr \/ |findstr name=”命令获取(需要提前将APP在手机上打开)。

2、点击搜索标志的小标,进行设置运行的参数,如图,运行成功,下载app成功,说明配置的环境成功

配置:

platformName    text(文本)  Android

deviceName      text     UUID(手机的)      #  cmd中录入adb devices

app         filepath      apk的路径文件

五、Android工具使用介绍

SDK常用工具

(1)SDK解压包中:tools——uiautomatorviewer.bat

(2)SDK解压包中:platform-tools——adb.exe

(3)获取包信息命令:aapt dump badging  xxx.apk

(4)app页面元素的定位:uiautomatorviewer.bat

(5)Android SDK manager里面什么是必须下载的?

         根据官方文档的描述
         SDK Tools 必须
         SDK Platform-tools 必须
         SDK Platform必须至少安装一个版本
         System Image建议安装
         Android Support建议安装
         SDK Samples建议安装

(6)解决Android SDK Manager下载太慢问题

打开android sdk manager

打开tool->options,如图所示

将Proxy Settings 里的HTTP Proxy Server和HTTP Proxy Port分别设置成mirrors.neusoft.edu.cn和80

将Others中的Force https://...sources to be fetched using http://...复选框勾上

(7)360助手端口暂用adb的端口5037

查看端口号:adb nodaemon server

查看被占用端口对应的PID,输入命令:netstat -aon|findstr "5037",回车,记下最后一位数字,即PID。

查看 是哪个进程:tasklist|findstr "9624"    9624 是PID

或者是我们打开任务管理器,切换到进程选项卡,在PID一列查看2720对应的进程是谁,如果看不到PID这一列,如下图:

(8)Android修改端口

Android默认的adb端口是5037,电脑上有一些应用的端口,又恰巧与adb端口冲突占用掉了

修改adb端口是最快最有效的解决方法:

再我的电脑下配置一下环境变量:新建一个环境变量 变量名为:  ANDROID_ADB_SERVER_PORT 
变量值为: 可以给自己设定一个数值,主要是为了不要和其他的程序端口冲突,建议10000——60000 之间,随便找一个数值。

(9)真正解决办法:将platform-toos中adb.exe复制到C:\Windows\System32解决

(10)wifi连接手机

https://blog.csdn.net/weixin_41253809/article/details/93195449

六、启动代码配置讲解

from appium import webdriver
capabilities = {
  "platformName": "Android",
  "deviceName": "47ef96800404",
  "app": "D:\\imooc7.1.110102001android.apk"
}
webdriver.Remote("http://127.0.0.1:4720/wd/hub",capabilities)

七、启动日志分析https://testerhome.com/topics/12499

八、页面滑动及初级使用

(1)屏幕页面没有元素滑动,用坐标轴来操作,以左上角为原点

from appium import webdriver


import time
def get_driver():
  capabilities = {
    "platformName": "Android",
    "deviceName": "47ef96800404",
    "app": "D:\\imooc7.2.010102001android.apk",
    "appActivity": "com.imooc.component.imoocmain.splash.MCSplashActivity",
    "appPackage": "cn.com.open.mooc",
    "automationName":"UIAutomator2"
  }
  driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",capabilities)
  return driver
driver = get_driver()
# 获取屏幕的宽高
time.sleep(2)
def get_size():
  size = driver.get_window_size()
  width = size['width']
  height = size['height']
  return width,height

# 向左滑动
def swipe_left():
  x1 = get_size()[0]/10*9
  y1 = get_size()[1]/2
  x = get_size()[0]/10
  driver.swipe(x1,y1,x,y1)
# 向右滑动
def swipe_right():
  x1 = get_size()[0]/10
  y1 = get_size()[1]/2
  x = get_size()[0]/10*9
  driver.swipe(x1,y1,x,y1)

# 向上滑动
def swipe_up():
  x1 = get_size()[0]/2
  y1 = get_size()[1]/10
  y = get_size()[1]/10*9
  driver.swipe(x1,y1,x1,y)

# 向下滑动
def swipe_down():
  x1 = get_size()[0]/2
  y1 = get_size()[1]/10
  y = get_size()[1]/10*9
  driver.swipe(x1,y1,x1,y1)

def swipe_on(direction):
  if direction == 'up':
    swipe_up()
  elif direction == 'down':
    swipe_down()
  elif direction == 'left':
    swipe_left()
  else:
    swipe_right()

swipe_on('left')
swipe_on('left')
swipe_on('left')
swipe_on('up')
swipe_on('up')
time.sleep(2)
driver.find_element_by_id('cn.com.open.mooc:id/tvSkip').click()

九、慕课网登录代码(id和classname定位元素)

from appium import webdriver


import time
def get_driver():
  capabilities = {
    "platformName": "Android",
    "deviceName": "47ef96800404",
    "app": "D:\\imooc7.2.010102001android.apk",
    "appActivity": "com.imooc.component.imoocmain.splash.MCSplashActivity",
    "appPackage": "cn.com.open.mooc",
    "automationName":"UIAutomator2",
    # "noReset":"true"
  }
  driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",capabilities)
  return driver
driver = get_driver()
# 获取屏幕的宽高
time.sleep(2)
def get_size():
  size = driver.get_window_size()
  width = size['width']
  height = size['height']
  return width,height

# 向左滑动
def swipe_left():
  x1 = get_size()[0]/10*9
  y1 = get_size()[1]/2
  x = get_size()[0]/10
  driver.swipe(x1,y1,x,y1)
# 向右滑动
def swipe_right():
  x1 = get_size()[0]/10
  y1 = get_size()[1]/2
  x = get_size()[0]/10*9
  driver.swipe(x1,y1,x,y1)

# 向上滑动
def swipe_up():
  x1 = get_size()[0]/2
  y1 = get_size()[1]/10
  y = get_size()[1]/10*9
  driver.swipe(x1,y1,x1,y)

# 向下滑动
def swipe_down():
  x1 = get_size()[0]/2
  y1 = get_size()[1]/10
  y = get_size()[1]/10*9
  driver.swipe(x1,y1,x1,y1)

def swipe_on(direction):
  if direction == 'up':
    swipe_up()
  elif direction == 'down':
    swipe_down()
  elif direction == 'left':
    swipe_left()
  else:
    swipe_right()

# 去登录
def go_login():
  driver.find_element_by_id('cn.com.open.mooc:id/tvSkip').click()
  time.sleep(3)
  driver.find_element_by_id("cn.com.open.mooc:id/ivOperation").click()
  time.sleep(3)
  driver.find_element_by_class_name('android.widget.TextView').click()
  time.sleep(3)

# 登录
def login():
  time.sleep(3)
  driver.find_element_by_id('cn.com.open.mooc:id/accountEdit').clear()
  driver.find_element_by_id('cn.com.open.mooc:id/accountEdit').send_keys('13641235100')
  driver.find_element_by_id('cn.com.open.mooc:id/passwordEdit').send_keys('wjs#182')
  driver.find_element_by_id('cn.com.open.mooc:id/login').click()
  time.sleep(3)
  element = driver.find_element_by_class_name('android.widget.TextView').text
  print(element)

swipe_on('left')
swipe_on('left')
swipe_on('left')
swipe_on('up')
swipe_on('up')
time.sleep(5)
go_login()
login()

十、层级定位思想分析

1、通过某一组元素定位:

例子方法:

elemet = find_elements_by_classname('class名字')

element[0].send_keys('账号')

element[1].send_keys('密码')

十一、通过uiautomator进行定位用户信息

元素定位方法:

def login_by_uiautomator():
    driver.find_element_by_android_uiautomator('new                                          
    UiSelector().text('18513199586')').send_keys('输入信息')

十二、通过xpath定位元素(尽量别用效率比较低在手机端)

1、xpath是一种在xml文档中定位元素的语言

2、绝对路径定位:

find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")

3、利用元素属性定位:

find_element_by_xpath("//input[@id='su']")

// 表示当前页面某个目录下,input表示定位元素的标签名,[@id='su']表示这个元素的id属性值等于su。

4、层级与属性结合:

find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")

span[@class='bg s_ipt_wr'] 通过 class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为
input 的子元素

5、使用逻辑运算符:

find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")

 and 连接更多的属性来唯一的标识一个元素

 

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值