点击文末小卡片免费获取软件测试全套资料资料在手涨薪更快1、Appium介绍appium是开源的移动端自动化测试框架appium可以测试原生的、混合的、以及移动端的web项目appium可以测试iosandroid应用当然了还有firefoxosappium是跨平台的可以用在osxwindows以及linux桌面系统上2、Appium基本原理在Android端appium基于WebDriver协议利用Bootstrap.jar最后通过调⽤用UiAutomator的命令实现App的自动化测试。UiAutomator测试框架是AndroidSDK自带的AppUI自动化测试Java库。另外由于UiAutomator对H5的支持有限appium引入了chromedriver以及safaridriver等来实现基于H5的自动化。2.1.appium在android端工作流client端也就是我们testscript是我们的webdriver测试脚本。中间是起的Appium的服务Appium在服务端起了一个Server4723端口跟seleniumWebdriver测试框架类似Appium⽀持标准的WebDriverJSONWireProtocol。在这里提供它提供了一套REST的接口,AppiumServer接收webdriverclient标准rest请求解析请求内容调⽤用对应的框架响应操作。appiumserver会把请求转发给中间件Bootstrap.jar它是用java写的安装在手机上.Bootstrap监听4724端口并接收appium的命令最终通过调⽤用UiAutomator的命令来实现。最后Bootstrap将执行的结果返回给appiumserver。appiumserver再将结果返回给appiumclient。3、Appium安装配置3.1.限制如果你在windows上安装appium你没法使用预编译专用于OSX的.app文件你也将不能测试IOSapps因为appium依赖OSX专用的库来支持IOS测试。这意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。3.2.傻瓜式安装node.js3.2.1.查看是否安装成功nodejs安装完毕后需要配置环境变量在PATH中添加D:\ProgramFiles\nodejs;3.3.傻瓜式安装Appium3.3.1.成功界面3.4.配置appium环境变量D:\Appium\node_modules\.bin3.5.打开控制台查看appium环境3.5.1.appium-doctor3.6.配置Android—环境变量D:\androidSDK3.7.Python中配置appium环境联网进入D:\python\Scripts打开控制台pipinstallAppium-Python-client3.8.总结1) androidsdk安装完毕后需要配置环境变量新建ANDROID_HOME在PATH中添加%ANDROID_HOME%:\.....2) nodejs安装完毕后需要配置环境变量在PATH中添加D:\ProgramFiles\nodejs;3) appium安装完毕后需要配置环境变量D:\ProgramFiles(x86)\Appium\node_modules\.bin;4) 配置好后启动cmd输入node-v查看node安装版本输入appium-doctor检查appium的安装环境是否成功5) 安装Python,配置环境变量4、第一个脚本示例4.1.首先通过eclpse启动android模拟器4.2.启动Appium4.3.点击左上角有“机器人”的按钮选择你的android版本4.4.点击右上角的“三角”按钮启动Appium。4.5.通过Python编写自动化测试脚本。desired_caps是一个字典用于在appiumserver与手机端建立会话关系时手机端需要告诉服务端设备相关的一些参数根据这些参数服务端可以做出相应的处理。4.6.画出来的这三个是需要在脚本中正确填写的4.7.执行效果5、Appium界面内容解析5.1.整体介绍主页面顶部从左到右依次是1、AndroidSettings:android相关的设置2、GeneralSettings全局设置设置appium相关的内容3、DeveloperSettings开发者设置一般不用需要关心4、Aboutappium相关信息不需要关心5、Inspector查找元素用的windows无法使用MAC可以使用windows可以不用关心。6、LaunchAppium启动appium按钮7、右下角清除日志按钮。5.2.AndroidSettings此页面分为Application、La、、四部分先看图之后分析分别有什么作用5.2.1.Application本模块设置被测试app信息如安装包路径、包名、activity等ApplicationPath选择要测试的apk选择他后与全局设置中的Pre-LaunchApplication配合启动appium时会先把apk安装到手机或模拟器再启动app。Package根据apk生成的app包名之前提到过的我们这个包的身份证我们需要通过这个去找到包不然我们安装后我们通过什么去辨别这些包呢WaitforPackage等待包名。LaunchActivityactivityActivity就是其中的一个个网页我们启动app时需要去运行的activity这里我们填写首次启动页面的activity。我们选择第一启动的activity与aapt命令生成的launchable-activity:name一致WaitforActivity和上面的差不多意思是等待某个Activity打开用的时间不是很多做了解。UseBrowser测试浏览器选择这项与前五项互逆。及选择了他前五个就不可以选择。FullReset将所有设置复位。即将手机模拟器恢复到启动到appium前的状态NoReset不需要重置手机模拟器中的app5.2.2.LaunchDevice本模块是模拟器设置针对的是SDK创建的模拟器不是genymotion等其他模拟器。LaunchAVD要启动的模拟器名称。DeviceReadyTimeout等待模拟器启动时间。Arguments启动模拟器时需要的参数。5.3.Capabilities运行测试的相关信息。PlatformName测试平台可以选择Android、FireFoxOS、MAC版的还可以选择IOS。PlatformVersion被测试手机模拟器版本。DeviceName设备名称手机连接电脑后打开cmd输入adbdevices可获取。Language被测试手机模拟器使用语言。Locale被测试手机模拟器所属区域。5.4.元素侦测这个按钮的功能和firebug的定位工具功能类似但是他还有一个功能他会检测你的各个系统配置是否正确如果前面各项参数不正确时使用该功能会报错。如果你不正常连接手机也不行。还是建议用sdk工具里面自带的uiautomatorviewer。5.5.启动服务所有参数配置好后你需要做的就是启动appium服务只有启动之后你才能够做自动化。5.6.清除日志右下角在写脚本、调试过程中会产生很多的日志但是你可能想看的只是中间某个时间段的那么你在这个时候可以将页面的日志清除。6、Appium查看界面元素的工具6.1.通过androidsdk的uiautomaterviewer获取元素内容uiautomatorviewer.bat是一个用来来扫描和分析Android应用程序的UI组件的GUI工具。具体使用方法可参考。打开uiautomatorviewer以后可以看到uiautomatorviewer已经将模拟器的图形展示在上面了。6.2.右侧xml节点详解7、获取appPackage和appActivityappPackage和appActivity进行appium自动化测试非常重要的两个参数我们所测试的APP不同这两个参数肯定也是不一样的。那如何快速的获取这APP的这两个参数呢7.1.方法一:通过cmd指令来获取1.adbshell2.dumpsysactivity|grepmFocusedActivity3.adbshelldumpsysactivityactivities7.2.方法二:使用Appium来获取进入设置页选择APK路径下面就会显示包名和Activity名称8、Appium常用定位方法讲解对象定位是自动化测试中很关键的一步也可以说是最关键的一步毕竟你对象都没定位那么你想操作也不行下面我们来看我们常用的一些定位方式。8.1.ID定位取resource-id的值无论是在web自动化还是app自动化中id都是唯一的可能有的小伙伴看到这里会有疑问因为有的资料说是通过name定位是唯一的为什么你这里是id呢其实这个在之前是不冲突的但是如果你用的是appium较新版本是不行的在新版本中name定位被去掉了所以在以后的定位中不会有name定位了通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问有的时候你的应用为什么没有id或者说在这个手机上有但是另外的手机上没有。1、开发没有添加。2、android版本是4.4以下的。如果我们需要对“7”这个数字进行点击操作driver.find_element_by_id(com.android.calculator2:id/digit7).click()8.3.className定位取class的内容在实际工作中className定位用得相对而言会比较少。当你经常去看class时你会发现很多的className是一样的你没有办法对其进行唯一定位下面我们看下面两张图片driver.find_element_by_class_name(android.widget.EditText).send_keys(111111)这种方式去定位你会发现你永远定位不了密码栏这是为什么呢因为在设计的时候如果你查找的元素在页面有多个系统会自动给你选择第一个所以你永远操作不了后面的8.4.text定位需要使用uiautomator的定位方式使用text的内容使用这里需要注意一下如果通过text定位的结果是个list不能直接click。所以如果要点击需要取数组的值比如下面是点击找到的第一个元素8.5.xpath定位xpath定位在web自动化中是最常见的而且也是最有效的使用xpath定位避免了找不到元素导致报错的问题但是在app中使用xpath定位是一件很low的事情。只要遇见使用xpath定位元素他的反应就会比较慢自动化的目的是为了提高效率但是使用xpath后会降低效率所以这里说很lowdriver.find_element_by_xpath(//android.widget.TextView[textJavaScript]).click()在xpath里面我们的语法是这样“//android.widget.TextView[textJavaScript]”这个和我们之前web的xpath一样意思是查找所有节点中节点为android.widget.TextView这里使用的是className也可以使用id系统会依次去找并且他的text属性值为JavaScript这样是否更容易理解呢下来多练习。这样的定位方式不推荐效率很慢。8.6.css_selector定位webview--加载网页--css只适用于webview的html页面继承自webdriver与pc版本的UI测试一致driver.find_element_by_css_selector()8.7.link_text定位webview只适用于webview容器中的html页面继承自webdriver与pc版本的UI测试一致driver.find_element_by_link_text()8.8.源代码10、Appium操作界面之触摸操作了解10.1.规范中的可用事件有*短按(press)*释放(release)*移动到(moveTo)*点击(tap)*等待(wait)*长按(longPress)*取消(cancel)*执行(perform)10.2.单点触摸TouchAction(driver)通过TouchAction对象添加tap、move_to等操作然后perform()执行可以实现解锁屏幕等功能actionTouchAction(driver) action.press(x220,y700).move_to(x840,y700).move_to(x220, y1530).move_to(x840,y1530).release().perform()10.3.多点触控MultiAction()通过MultiAction().add()添加多个TouchAction操作最后调用perform()一起执行这些操作举例action0TouchAction().tap(el) action1TouchAction().tap(el) MultiAction().add(action0).add(action1).perform()10.4.滑动driver.swipe(x1,y1,x2,y2,duration)命令解释从坐标(x1,x2)滑动到坐标(x2,y2)duration非必填项滑动时间滑动时中间要加等待时间不加等待时间容易出错而且加等待时间的长短也要掌握好一般在200-1000毫秒之间应该差不多自己调试几次感觉一下哪个时间比较稳每个程序可能会有所差异滑动的坐标不能超过屏幕的宽高可以通过【driver.get_window_size()】命令获得窗口高和宽{width:1080,height:1788}#获得机器屏幕大小x,y defgetSize(driver): xdriver.get_window_size()[width] ydriver.get_window_size()[height] return(x,y) #屏幕向上滑动 defswipeUp(driver,t500): lgetSize(driver) x1int(l[0]*0.5)#x坐标 y1int(l[1]*0.75)#起始y坐标 y2int(l[1]*0.25)#终点y坐标 driver.swipe(x1,y1,x1,y2,t) #屏幕向下滑动 defswipeDown(driver,t500): lgetSize(driver) x1int(l[0]*0.5)#x坐标 y1int(l[1]*0.25)#起始y坐标 y2int(l[1]*0.75)#终点y坐标 driver.swipe(x1,y1,x1,y2,t) #屏幕向左滑动 defswipLeft(driver,t500): lgetSize(driver) x1int(l[0]*0.75) y1int(l[1]*0.5) x2int(l[0]*0.05) driver.swipe(x1,y1,x2,y1,t) #屏幕向右滑动 defswipRight(driver,t500): lgetSize(driver) x1int(l[0]*0.05) y1int(l[1]*0.5) x2int(l[0]*0.75) driver.swipe(x1,y1,x2,y1,t)10.5.长按示例10.6.2.打开界面使用如下指令查看activity和package10.6.3.编写python脚本代码11、系统按键事件了解press_keycode(AndroidKeyCode)#发送按键事件例如点击home键home键的KeyCode是312、driver的一些比较重要操作12.1.reset()#重置app#这时候driver会重置相当于卸载重装应用。所以本地缓存会失效 driver.reset()12.2.start_activity(包名,activity名)例如#启动app的某一个activity启动一个activity这个activity必须是AndroidManifest.xml中有intent-filter的activity对于其他的activity需要程序跳转过去12.3.scroll(起始元素结束元素)driver.scroll(origin_el,destination_el)12.4.获得当前页面的所有元素driver.page_source这可以用来判断元素是否存在例如assert“发布成功”indriver.page_source12.5.补充一些driver启动时可能用到的项了解其实这些在上一篇启动里都有介绍但是有些可能大家没注意到的点再列一下。这些点也是我在测试中实际遇到的点autoLaunchAppium是否要自动启动或安装app默认true desired_caps[‘autoLaunch’]‘false’有的时候我不想让appium每次都启动app想自己去启动activity那这个项这时就可以起作用了noReset在会话前是否重置app状态。默认是false desired_caps[‘noReset’]‘true’newCommandTimeout设置未接收到新命令的超时时间默认60s如果60s内没有接收到新命令appium会自动断开连接如果我需要很长时间做driver之外的操作可能延长接收新命令的超时时间 desired_caps[“newCommandTimeout”]180013、自动化测试简单案例-登录13.1.打开UIAutomatorViewer13.2.代码实现driver.find_element_by_id(com.example.login:id/et_username).send_keys(hello); driver.find_element_by_id(com.example.login:id/et_password).send_keys(123); driver.find_elements_by_class_name(android.widget.Button)[1].click()14、自动化测试案例2-转转14.1.下载转转并打开在初始界面查看包和activity14.2.使用UIAutomatorViewer查看转转按钮14.3.点击跳过#强制等待3秒钟 time.sleep(3) #跳过按钮 #driver.find_element_by_id(com.wuba.zhuanzhuan:id/arw).click()14.4.点击分类driver.implicitly_wait(10) #分类按钮 driver.find_element_by_id(com.wuba.zhuanzhuan:id/b1v).click() driver.implicitly_wait(10) #搜索按钮 driver.find_element_by_id(com.wuba.zhuanzhuan:id/b1p).click() driver.implicitly_wait(10) #搜索框中输入搜索内容 driver.find_element_by_id(com.wuba.zhuanzhuan:id/mg).send_keys(u电动车) time.sleep(10) #点击搜索 driver.find_element_by_id(com.wuba.zhuanzhuan:id/mi).click() driver.quit()15、启信宝案例#coding:utf-8 fromappiumimportwebdriver #desired_caps是一个字典 desired_caps{} #你要测试的手机操作系统 desired_caps[platformName]Android #手机操作系统的版本 desired_caps[platformVersion]7.0 #使用的手机类型或模拟器类型 desired_caps[deviceName]XPUDU17113015063 #deviceName你的模拟器名字就是在下载AVD的时候你填写的忘 了的回头去找或者在模拟器顶部会显示 #所运行的app包名 desired_caps[appPackage]com.bertadata.qxb #app运行的事件 desired_caps[appActivity].activity.SplashActivity #启动打开app driverwebdriver.Remote(http://127.0.0.1:4723/wd/hub, desired_caps) #根据元素定位执行点击操作 driver.implicitly_wait(10) serh driver.find_element_by_id(com.bertadata.qxb:id/tv_home_searc h_desc) serh.click() driver.find_element_by_id(com.bertadata.qxb:id/et_search_con tent).send_keys(优思安科技) driver.quit()最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你凡事要趁早特别是技术行业一定要提升技术功底。