pathon3 appium环境搭建以及基础(不包含代码)

一.环境搭建

  我的是win10

    sdk:解压文件夹
配置 ANDRIOD_HOME 1.新建系统变量 ANDRIOD_HOME
2.path中添加 %ANDROID_HOME%\tools %ANDROID_HOME%\platform-tools %ANDROID_HOME%\build-tools\29.0.0
命令行输入adb是否安装好
配置 JAVA_HOME 1.C:\Program Files\Java\jdk1.8.0_162 %JAVA_HOME%\jre\bin %JAVA_HOME%\bin
配置CLASSPATH %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
javac查看 是否配置好
安装nodejs:https://nodejs.org/en/download/

adb devices: 检查设备,如果是真机,打开开发者选项里面的usb调试
(我的是oppo a7x 打开步骤:设置——关于手机——版本号[点7下]——回退——其他设置——开发者选项——打开usb调试)


nodejs环境:命令行输入npm[我下载的是免安装的zip包,进入到该目录下]
        然后把nodejs配置到环境变量中去

安装cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
安装模拟器:夜神,雷电
appium环境安装,定位元素,第一个列子
安装appium: npm install appium -g --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
npm install appium-doctor -g
       appium-doctor 查看是否安装成功

离线安装:https://blog.csdn.net/a136332462/article/details/78202724

 

 在pycharm中导入from appium import webdriver报错的话要安装setting中安装appium-python-client

找到包名和activity:

  C:\Program Files\Android-SDK下双击SDK-manage.exe出来页面勾选Build-tools,进行下载和安装。

  2.设置环境变量到path

  %ANDROID_HOME%=D:\Programs\Android\android-sdk

  path中添加%ANDROID_HOME%\app.exe所在路径

当出现 adb不是内部或外部命令,也不是可运行的程序,解决办法:

方法1.C:\Program Files\Android-SDK\platform-tools将这个配置到环境变量path中

方法2.将C:\Program Files\Android-SDK\platform-tools的这三个文件copy放在统system32文件夹下面【亲测好用】

 二.基础

appium原理:

  1. client端也就是我们的测试脚本。

  2. 中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口), Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。

  3. appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上.Bootstrap监听4724端口并接收appium 的命令,最终通过调⽤用UiAutomator的命令来实现。

  4. 最后Bootstrap将执行的结果返回给appium server。

  5. appium server再将结果返回给 appium client。

 

1.定位元素:在app自动化中有一句话是能不用xpath就不用xpath
打开D:\Android-SDK\tools -uiautomatorviewer.bat
      【果启动闪退,打开cmd把文件扔到cmd中运行,查看具体的报错信息】
 第1种:resource-id:find_element_by_id(resource-id)
第2种:class:find_element_by_classname(class)
第3种:text:find_element_by_name(text)
第4种:content-desc:find_element_by_accessibility_id(content-desc)

xpath: @属性://*[@content-desc='' and @index='4'] 组合定位
//*[@text='']
上下级:/.. /
contains模糊定位
    记录一个:xpath定位表达

      loc='//*[contains@text,"{}"]'.format("手机号或者密码")


    uiautomator是Java类,实例化的时候用new关键字
    Java中字符串是双引号
    该种方法的定位效率很高,原本就是人家本身自带的,都不用转换
  第5种:appium之android_uiautomator定位
     driver.find_element_by_android_uiautomator( new UiSelector().text(text)).click()
new UiSelector().text(text)
     new UiSelector().textContains("包含text文本")
     new UiSelector().textStartsWith("以text文本开头")
     new UiSelector().textMatches("正则表达式")

new UiSelector().resourceId(resource-id)
new UiSelector().className(class)
     new UiSelector().description("contenet-des属性")
    更加高级的定位方式:https://www.cnblogs.com/xiaohuhu/p/9895253.html

  和web自动化定位的方式:
    不用考虑上下级关系什么的,如果是比较规范的app,有id就能走遍天下
  第6种:坐标定位(但是是在万不得已的情况下采用,因为坐标定位不稳定)
【元素操作的四大属性:点击,输入,获取元素属性值,获取元素文本值】

  还有就是在使用的过程中,经常会报 Error obtaining hierarchy 这个错。

  好像是因为appium和UI Automator Viewer都会调用同一个资源。当使用appium代码启动app,不加上关闭的代码。再去使用UI Automator Viewer获取屏幕会报错。把这个app关了,或者appium关了,再去使用UI Automator Viewer就可以了。


webdriver.Remote实际上就是原生webdriver的子类,另外Remote()构造函数的第一个参数中需要显示指定appium server监听的端口
这个地址为http://127.0.0.1:4723/wd/hub,wd/hub

三.appium常用操作
  等待:
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from appium.webdriver.common.mobileby import MobileBy
WebDriverWait(driver,20).until(EC.visibility_of((MobileBy.ID,'XXXXXX')))
   滑屏:swipe
size=driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5

end_x=size['width']*0.1
end_y=size['height']*0.5
#从右往左滑
driver.swipe(start_x,start_y,end_x,end_y,200)
#从左往右滑
driver.swipe(end_x,end_y,start_x,start_y,200)
View Code

    模拟触屏:TouchAction类

      from appium.webdriver.common.touch_action import TouchAction

      将一系列的动作放在一个链条种,然后 将该链条传递给服务器,服务器接受到该链条后,解析该链条种的每个董总,逐个执行;

      短按:press  长按:longpress  点击:tap  移动到:move_to   x,y相对上一个坐标的移动距离

      等待:wait    释放:release   执行: perform  取消: cancel

    看源码可以知道移动可以用元素定位也可以用坐标,看情况

 

 

 

 

 

 


原生应用,混合应用【Hybrid App】,H5应用【web app】

原文链接:https://blog.csdn.net/sun_DongLiang/article/details/83684076

  开发者选项中——打开显示布局边界

  如果app是web的界面,那界面不会有布局边界显示,如果有说明是native的界面或者通过定位工具,显示webview(网页视图)

原生app之所以称之为原生是因为他在开发时是由移动设备厂商自身提供的SDK或建议的开发方式来进行开发的;通常有android和ios两类开发方式,他们分别是基于Java语言和C++语言的,因此使用原生开发每一类app所需要的语言也不太一样。

 

  混和式App结合了原生App的支持度与Web App网页设计的技术,使用web app的技术进行开发,再封装成类似原生一样的app。

  

 现在大部分app都是混合式的native+webview,对应native上的元素通过uiautomatorviewer很容易定位到,webview上的元素就无法识别了;

  H5开发时使用html,css,JavaScript开发的一个展示型应用,主要用于浏览器中进行点击后展示一些信息,他不能够调用手机底层的设备,比如说:手机版的小米官网,手机版的苹果官网;
  具体的表现是在手机浏览器中会有一些应用的小图标,这些小图标在点击后,在浏览器中加载页面和你下载的app后打开页面是相同的,而这些小图标代表的就是web app,只能显示一个整体页面。

 

 

 定位元素的时候:第一种:需要FQ,用第四种:参考 原文链接https://www.cnblogs.com/yyoba/p/9969394.html

可以在应用商店下载的app,一般都是关闭debug模式

 


 

 webview:

原文链接:https://blog.csdn.net/qq_42293590/article/details/82693112

① 可以理解与selenium里的iframe类似

 

②在右边定位里有明确的表示是 WebView

 

③点击一个链接后,有进度条加载后页面一般都是Webview.  也就是说,是一个H5页面了

 

④UI Automator 不能定位到里面的元素

 

处理方法1:

 

①执行  print(driver.contexts)  获取所有的上下文

 

②在切换到他的webview里面去(类似selenium里的切换窗口)

 

③获取到他的webview源码,在其他浏览器打开,获取他的xpath路径,或者其他定位方法

 

 但是如果但是打印全部上下文返回的list里只有NATIVE_APP,无法进行切换。就不要去切换了,当做是APP原生的,只需要定位到某个元素就行;

 

 当然也有的app有坑,可能明明有webview,却通过contexts获取不到,这种需要特殊处理了)

【NATIVE_APP:这个就是native,也就是原生的、WEBVIEW_com.xxxx :这个就是webview】

 注意啦:当出现chromdriver不匹配的时候看看这个文件夹:很深:C:\Program Files (x86)\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win

 切回原生native:列子是python2,换成python3的代码即可;

 

 

 

 

WEB端和移动端的一些简单区别:

  1.basepage 新增了移动的方法:滑屏/toast获取/h5切换

  2.元素定位方式不同,新增了移动端的定位方式。

    PageLocators全部换成移动端的定位

    屏幕大小,页面布局,页面功能有差异,页面划分

  3.会话启动方式:

    web自动化:webdriver.Chrome()

    app自动化:(1)提供平台信息和app信息:平台版本,平台名称,设置名称,app包名,app入口activity

          (2)与appium server进行连接,并发送平台和app信息

    toast信息:安卓的自带框架:

'automationName':'UiAutomator2'

 

 

appium noReset是什么意思

 https://www.cnblogs.com/myal/p/10862411.html

想输入中文怎么办?

原文链接:https://www.cnblogs.com/zz-yy/p/8432725.html

在配置参数中加上:

 'unicodeKeyboard': True

 'resetKeyboard': True

在需要输入中文的文字前面加上u    u"我爱中国哈哈哈"

如果中文乱码:前面加上“#--coding:gb18030--”

driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"我爱你中国")

  android的系统是基于linux系统开发的,adb shell就是进入shell模式;

关于adb shell input keyevent:

原文链接:https://www.cnblogs.com/zzugyl/p/7515004.html

待优化:

  1.通过adb命令获取当前连接的设备信息,平台版本。。。然后放在basedriver

  2.多机并行执行【pytest 允许接受命令行的传参,pytest.main(),

          一个appium server对应一台设备,五台设备==五个appium server

           python 的多线程】

 

 

 


    


















posted @ 2019-10-07 14:46  小猪猪猪  阅读(199)  评论(0)    收藏  举报