APP测试01

1. 环境准备

    1-1. 安装selenium环境(版本3.141.0)


    1-2. 安装JDK(环境变量配置)


    1-3. 安装nodejs(傻瓜式安装,win7最高支持V13.14.0,win10用v14.16.0,npm是6.14.11)
            下载地址:https://nodejs.org/en/download/ 
                            http://nodejs.cn/download/
            DOS验证:npm version


    1-4. 安装appium (提前关闭360卫士、腾讯管家等,版本1.7.1)
            下载地址:https://github.com/appium/appium-desktop/releases/
            一键傻瓜式安装(约5分钟)

            在线安装(不建议,时间太长!)
                设置淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org
                安装指定版本:cnpm install appium@1.7.2 -g
                安装最新版本:cnpm install -g appium        


    1-5. 安装Android SDK (可以看做用于开发和运行Android 应用的软件)

                官方下载地址: https://developer.android.com/studio/index.html
                国内镜像地址: http://tools.android-studio.org/index.php/85-tools/110-androidsdk-mirrors
                http://www.androiddevtools.cn/(访问不了)    
                最底部下载对应的SDK 工具包就可以了(SDK Tools)

            环境变量配置
                变量名:ANDROID_HOME    
                变量值:C:\tools\Andriod_SDK或 C:\tools\adt\sdk或 C:\tools\android-sdk-windows(看情况定)
                变量名:PATH
                变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;


    1-6. 安装Appium-Python-Client(版本1.3.0)

                pip install Appium-Python-Client
                pip install -i https://pypi.douban.com/simple/ appium-python-client
                pip install -i https://pypi.douban.com/simple/ appium-python-client==1.3.0


    1-7. 夜神模拟器 (版本6.2.8.2)

            6.2.7.0是安卓4.4.2 (设置)
            6.2.8.2是安卓5.1.1 (通讯录、文件管理器、设置一级界面)

--------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------

2. 常用adb命令

    2-1. 连接设备        adb connect 设备名,例如:adb connect 127.0.0.1:62001

                夜神模拟器:adb connect 127.0.0.1:62001/62025

            断开连接: adb disconnect 设备名


    2-2. 查看设备        adb devices            查看当前连接到计算机的android设备


    2-3. 安装软件        adb install 包名        将指定的apk文件安装到设备上(包名不要有中文)

              adb install 路径\release.apk        或先输入adb install,再将apk包拖到DOS窗口

            若显示success,说明安装apk包成功,若显示Failure,则安装失败。
            检查错误,排错后,再执行命令:abd install -r 包名.apk


    2-4. 获取app的包名和activity名称

            输入下面的命令后打开软件,查看cmp后面的值

            adb logcat -v time | findstr START        脚本中,cmp= 后面的值就是 包名
            
                Ctrl + C 退出
            
            查看当前运行的APP的包名和打开的Activity
            adb shell "dumpsys window | grep mCurrentFocus" 

            adb shell dumpsys window | findstr mCurrentFocus


    2-5. 卸载软件        adb uninstall 包名

            获取包名(单个设备)
            adb shell pm list packages -3    (3指的第三方)

            获取包名(多个设备)
             adb -s 设备名 shell pm list packages -3


    2-6. 把本地文件上传到Android设备            adb push 本地文件路径 Android设备路径

            例:把E:\android\test.txt 上传到安卓服务器的/storage/sdcard0/目录
                    adb push E:\android\test.txt /storage/sdcard0/

              PS:文件管理器,依次进入storage/sdcard0,就能查看到刚才上传的文件
                      也可以使用命令adb shell,进入shell模式下,使用Linux命令查看,使用exit命令退出

              注:只能上传文件,无法上传文件夹
    

    2-7. 把Android设备的文件下载到本地            adb pull Android设备上的文件路径 本地路径

            例:把安卓服务器的/storage/sdcard0/test.txt下载到本地磁盘中的E:\android\目录
                adb pull /storage/sdcard0/test.txt E:\android


    2-8. 连接真机        安卓驱动下载:https://adbdriver.com/downloads/

    步骤:手机连接电脑 → 安装驱动 → 连点7次版本号打开开发者选项 → 勾选USB调试 → 手机端允许授权

            C:\Users\Administrator>adb devices
            List of devices attached
            727f22be        device (有线,插线即连接)

            C:\Users\Administrator>adb tcpip 5555
            restarting in TCP mode port: 5555

            C:\Users\Administrator>adb connect 192.168.0.9:5555
            * daemon not running. starting it now at tcp:5037 *
            * daemon started successfully *
            connected to 192.168.0.9:5555

            C:\Users\Administrator>adb devices
            List of devices attached
            192.168.0.9:5555        device  (无线)        

            taskkill /f /pid 2345
            taskkill /f /im chrome.exe    
            taskkill /f /im wininit.exe    蓝屏

---------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------


3. appium内容

    Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。
     它使用WebDriver协议驱动iOS,Android和Windows应用程序。

    Appium的运行原理,和selenium有点类似,都可以理解为c/s架构。
    我们的电脑(c端)上运行自动化测试脚本,调用的是appium的webdriver的接口,
    appium服务器(s端)接收到我们client上发送过来的命令后,
    他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来在设备上执行自动化。

    3-1. appium直接启动APP

            1. 打开appium,默认simple(基础设置)标签页下点击Start Server 1.9.1
            2. 点击右上角放大镜图标Start Inspector Session(启动检查器会话)
            3. 新页面左下方Desired Capabilities(参数设置),依次填写以下内容:
                        平台名称、平台版本、设备名称、包名、activity(可理解为应用页面)
                              "platformName": "Android",
                              "platformVersion": "5.1.1",
                              "deviceName": "127.0.0.1:62001",
                              "appPackage": "com.android.settings",
                              "appActivity": "com.android.settings.Settings"

            4. 保存参数设置,以便下次使用。点击右下角 Start Session启动会话    
            5. 打开新页面后,从左往右三部分:页面预览、页面代码、元素定位
            6. 上方工具条分别是元素拾取、滑动、点击、返回、刷新、录制、元素查询、复制、退出  
            7. 右侧上方三个功能按钮分别是点击、输入、清空

        Desired capability的功能是配置Appium会话,告诉Appium服务器我们想要自动化的平台和应用程序。
        Desired Capabilities是一组设置的键值对的集合,主要用于通知Appium服务器建立需要的Session。

        获取包名及activity命令:adb shell dumpsys window |findstr mCurrentFocus

    3-2. 元素捕捉工具

            Inspector:appium开启会话之后的页面

            Uiautomatorviewer:SDK\tools\uiautomatorviewer.bat,但经常报错且无解    。

    3-3.  python连接appium,启动APP

        from appium import webdriver

        # 打开设置页面(夜神模拟器v6.2.8.2的设置APP)
        desired_caps = {
            "platformName": "Android",                         # 操作系统
            "platformVersion": "5.1.1",                        # 系统版本
            "deviceName": "127.0.0.1:62001",                   # 设备名称
            "appPackage": "com.android.settings",              # 测试包名
            "appActivity": "com.android.settings.Settings"  # 打开页面
            # ,"unicodeKeyboard": "True"   # 使用unicode编码方式发送字符串
            # ,"restKeyboard": "True"      # 将键盘隐藏一起来
        }
        # 也可以用appium里面的http://localhost:4723/wd/hub
        dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)    

        wd:可以理解是WebDriver的缩写
        hub:是指主节点、中心节点

    3-4. 元素定位

        1)常规定位---------------------------------------

            与Web自动化测试一样,app自动化测试过程中最重要一个环节就是元素定位,
            只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。
            appium提供了许多元素定位的方法,如id定位、class定位、xpath定位等等。

            resource-id 对应 id定位方式
            class 对应 class


        from appium import webdriver

        # 打开简书v1.9.7页面(夜神模拟器v6.2.8.2)
        desired_caps = {
          "platformName": "Android",
          "platformVersion": "5.1.1",
          "deviceName": "127.0.0.1:62001",
          "appPackage": "com.jianshu.haruki",
          "appActivity": "com.baiji.jianshu.account.LoginActivity" }

        dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)


        # 1-1. 根据id定位
        inputBox = dr.find_element_by_id("com.jianshu.haruki:id/edit_email")
        inputBox.send_keys("python")

        # 1-2. 根据class定位
        inputBox = dr.find_element_by_class_name("android.widget.EditText")
        inputBox.send_keys("good")

        # 1-3. 根据xpath定位
        inputBox = dr.find_element_by_xpath('//*[@resource-id="com.jianshu.haruki:id/edit_email"]')
        inputBox.send_keys("appium")
        # 多个元素属性
        loc = '//*[@resource-id="com.jianshu.haruki:id/edit_email" and @class="android.widget.EditText"]'
        dr.find_element_by_xpath(loc).send_keys("bad")

        2) UIAutomator定位-----------------------------

            UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,
            且支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。
            Appium元素定位方法其实也是基于Uiautomator来进行封装的。
            使用方法 
                find_element_by_android_uiautomator('new UiSelector().resourceId("")') 
                find_element_by_android_uiautomator('new UiSelector().text("")') 
                find_element_by_android_uiautomator('new UiSelector().className("")') 
    

        # 2-1. 根据('new UiSelector().resourceId("")')定位
        inputBox = dr.find_element_by_android_uiautomator\
            ('new UiSelector().resourceId("com.jianshu.haruki:id/edit_email")')
        inputBox.send_keys("hard")
        inputBox.clear()

        # 2-2. 根据('new UiSelector().text("")')定位
        inputBox = dr.find_element_by_android_uiautomator\
            ('new UiSelector().text("邮箱或手机号")')
        inputBox.send_keys("hard2")

        # 2-3. 根据('new UiSelector().className("")')定位
        inputBox = dr.find_element_by_android_uiautomator\
            ('new UiSelector().className("android.widget.EditText")')
        inputBox.send_keys("hard3")

        3)  二次定位----------------------------------------

            先定位到元素父节点,再在父节点包含的内容中查找元素


        # 先定位到账号输入框的父节点
        ele = dr.find_element_by_class_name("android.widget.LinearLayout")
        # 再在父节点包含的内容中查找元素
        ele2 = ele.find_element_by_id("com.jianshu.haruki:id/edit_email")
        ele2.send_keys("two")

        4) 定位一组元素-----------------------------

            find_elements_by_xxx( ),注意elements的s


        # 定位一组元素,第1个是用户名,第2个是密码
        ele = dr.find_elements_by_class_name("android.widget.EditText")
        ele[0].send_keys("admin")
        ele[1].send_keys("123456")

    3-5. Appium常用API


        1) 输入中文------------------------------------

            在capability中加入unicodeKeyboard和resetKeyboard两个参数即可


                # 打开简书v1.9.7页面(夜神模拟器v6.2.8.2)
                desired_caps = {
                  "platformName": "Android",
                  "platformVersion": "5.1.1",
                  "deviceName": "127.0.0.1:62001",
                  "appPackage": "com.jianshu.haruki",
                  "appActivity": "com.baiji.jianshu.account.LoginActivity" ,
                  "unicodeKeyboard": "True",  # 使用unicode编码方式发送字符串
                  "resetKeyboard": "True"     # 将键盘隐藏起来
                     }    

                dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
                ele = dr.find_elements_by_class_name("android.widget.EditText")
                ele[0].send_keys("中文用户名")

         2) 两点之间滑动 --------------------------------

             两点之间滑动,适用于刷微博、看图片等上下滑动、左右移动的场景。
             swipe(x1, y1, x2, y2, duration=0)
             swipe(起始横坐标,起始纵坐标,目标横坐标,目标纵坐标,持续时间)
             左上角为原点(0,0)。持续时间为滑动时间,单位毫秒,默认为空,即可以不填

             注:    有时候在滑动前,可以强制等待1秒,避免出错(元素未加载完成)。
                     如果坐标不好计算,可以打开手机开发者选项的指针位置直接查看

                # 打开设置APP页面(夜神模拟器v6.2.8.2)
                desired_caps = {
                    "platformName": "Android",
                    "platformVersion": "5.1.1",
                    "deviceName": "127.0.0.1:62001",
                    "appPackage": "com.android.settings",
                    "appActivity": "com.android.settings.Settings" }
                dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
                # dr.implicitly_wait(10)  # 隐式等待10秒

                # 获取屏幕尺寸
                def screenSize():
                    x = dr.get_window_size()["width"]
                    y = dr.get_window_size()["height"]
                    return x,y
                size = screenSize()
                print(size) # 返回的元组

                # 向上滑动
                def swipeUp():
                    x1 = size[0]*0.5
                    y1 = size[1]*0.8
                    y2 = size[1]*0.2
                    dr.swipe(x1,y1,x1,y2)
                swipeUp()

                # 向下滑动
                def swipeDown():
                    x1 = size[0] * 0.5
                    y1 = size[1] * 0.2
                    y2 = size[1] * 0.8
                    dr.swipe(x1,y1,x1,y2,1000)
                swipeDown()

                # 向下滑动两次
                for i in range(2):
                    swipeDown()


        3) 连续滑动 ------------------------------------

            连续滑动适用于手势密码操作,切西瓜等场景,使用appium的TouchAction类。
            TouchAction类包含一些列操作,比如按压、长按、点击、移动、暂停,释放、执行等,
            由这些不同的操作可以组成一套动作。使用方法如下:
            from appium.webdriver.common.touch_action import TouchAction
            TouchAction(driver).press(element)
            TouchAction(driver).press(x=0,y=308)

            1.按压元素或坐标点,press(el=None,x=None,y=None)
            2.长按元素或坐标点,long_press(el=None,x=None,y=None,duration=1000),持续时间为毫秒
            3.点击元素或控件,tap(element=None,x=None,y=None,count=1),次数默认为1
            4.移动到指定的元素或点,move_to(el=None, x=None, y=None),
                移动到目标位置有时是算绝对坐标点,有时是基于前面一个坐标点的偏移量,要结合具体App来实践。
            5.暂停脚本的执行,wait(ms=0),单位为毫秒。
            6.释放,release(),即滑动停止
            7.执行,perform(),把要执行的操作发送到Appium服务器,即让要执行的操作生效。


                # 打开随手记V10.5.6.0(夜神模拟器v6.2.8.2)
                # 首页→右下角的【更多】→滑动到【高级】→密码与手势密码

                from appium import webdriver
                from appium.webdriver.common.touch_action import TouchAction
                import time

                desired_caps = {
                    "platformName": "Android",
                    "platformVersion": "5.1.1",
                    "deviceName": "127.0.0.1:62001",
                    "appPackage": "com.mymoney",
                    "appActivity": "com.mymoney.biz.main.MainActivity"
                    }
                dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
                dr.implicitly_wait(10)  # 隐式等待10秒

                # 获取屏幕尺寸
                def windowSize():
                    x = dr.get_window_size()["width"]
                    y = dr.get_window_size()["height"]
                    return (x,y)
                size = windowSize()

                # 向上滑动
                def swipeUp():
                    x1 = size[0] * 0.5
                    y1 = size[1] * 0.8
                    y2 = size[1] * 0.2
                    dr.swipe(x1,y1,x1,y2,1000)

                # 点击右下角的【更多】
                more = dr.find_element_by_id("com.mymoney:id/nav_setting_btn")
                more.click()

                # 滑动之前强制等待1秒,否则会因页面元素未加载完成导致报错
                time.sleep(1)

                # 向上滑动页面
                swipeUp()

                # 点击【高级】
                senior = dr.find_element_by_android_uiautomator\
                    ('new UiSelector().text("高级")')
                senior.click()

                # 点击【密码与手势密码】
                passwd = dr.find_element_by_android_uiautomator\
                    ('new UiSelector().text("密码与手势密码")')
                passwd.click()

                # 点击【手势密码保护】
                protect = dr.find_element_by_android_uiautomator\
                    ('new UiSelector().text("手势密码保护")')
                protect.click()

                # 手势密码设置(连续滑动Z字形)
                TouchAction(dr).press(x=210,y=290).wait(1000)\
                    .move_to(x=510,y=290).wait(1000)\
                    .move_to(x=210,y=580).wait(1000)\
                    .move_to(x=510,y=580).wait(1000)\
                    .release().perform()


        4) 多点触控操作----------------------------------------------------------------------

            在对照片、地图进行缩放时,需要至少两个手指头同时触碰屏幕操作,叫做多点触控。
            在Appium里面实现多点触控,使用MultiAction类,该类提供了add()和perform()两个方法,
            结合TouchAction类,可以模拟出用户使用多个手指进行多点触控操作的场景。

            from appium.webdriver.common.touch_action import TouchAction    # 连续滑动
            from appium.webdriver.common.multi_action import MultiAction    # 多点触控
            zoomAction = MultiAction(dr)
            t1 = TouchAction(driver).press(element1).wait(ms).move_to(element2).release()
            t2 = TouchAction(driver).press(element1).wait(ms).move_to(element2).release()
            zoomAction.add(t1,t2)  # 将TouchAction对象添加到MultiAction里面
            zoomAction.perform()   # 执行MultiAction

            sleep(2)

            # 获取屏幕尺寸
            def windowSize():
                x = dr.get_window_size()["width"]
                y = dr.get_window_size()["height"]
                return (x,y)

            # 封装放大
            def enlarge():
                x = windowSize()[0]
                y = windowSize()[1]
                print(x,y)
                # 实例化类
                zoomAction = MultiAction(dr)
                a1 = TouchAction(dr).press(x=x*0.4,y=y*0.4).wait(500).move_to(x=x*0.3,y=y*0.3).release()
                a2 = TouchAction(dr).press(x=x*0.6,y=y*0.6).wait(500).move_to(x=x*0.7,y=y*0.7).release()
                zoomAction.add(a1,a2)   # 将TouchAction的对象添加到MultiAction中
                zoomAction.perform()    # 执行MultiAction中的TouchAction对象

            # 封装缩小
            def reduce():
                x = windowSize()[0]
                y = windowSize()[1]
                print(x,y)
                # 实例化类
                zoomAction = MultiAction(dr)
                a1 = TouchAction(dr).press(x=x*0.3,y=y*0.3).wait(500).move_to(x=x*0.4,y=y*0.4).release()
                a2 = TouchAction(dr).press(x=x*0.7,y=y*0.7).wait(500).move_to(x=x*0.6,y=y*0.6).release()
                zoomAction.add(a1,a2)   # 将TouchAction的对象添加到MultiAction中
                zoomAction.perform()    # 执行MultiAction中的TouchAction对象

            # 执行放大
            # enlarge()


        5) Toast识别------------------------------------------------------------

            Toast是浮动的消息提示框,一般显示3秒左右,无法被点击,无法使用传统的元素定位。
            Toast类的思想就是尽可能不引人注意,同时还向用户显示信息。
            Appium 1.6.3开始支持识别Toast内容,安卓系统必须5.0以上,主要是基于UiAutomator2

                # 只能使用xpath定位,才会成功
                text = "您现在处于开发者模式!"
                loc = "//*[@text='{}']".format(text)
                print(loc)
                toast = dr.find_element_by_xpath(loc).text
                print(toast)


                # 也可根据部分文本信息
                toast = dr.find_element_by_xpath('//*[contains(@text,"开发者模式")]').text
                # toast的className值为:android.widget.Toast
                toast = dr.find_element_by_xpath('//*[@class="android.widget.Toast"]').text
                print(toast)

                下面前2步不安装也行?
            (环境准备第2步失败?win7最高支持V13.14.0的node.js,win10用v14.16.0,npm是6.14.11)
            1、先安装淘宝镜像:
                npm install -g cnpm --registry=https://registry.npm.taobao.org
            2、安装appium-uiautomator2-driver:
                cnpm install appium-uiautomator2-driver
            3、最后在Capablity配置如下参数:
                desired_caps['automationName']='uiautomator2'

        

        6) H5元素的定位----------------------------------------------------

             H5元素定位:原生APP环境→web环境
            在混合开发的App中,经常会有内嵌的H5页面,可理解为web端的表单切换。
            常规定位都是基于Andriod原生控件进行的,而Web网页是单独的B/S架构,
            两者的运行环境不同,因此需要进行上下文(context)切换,然后对H5页面元素进行定位操作。

            在程序中context可以理解为当前对象在程序中所处的一个环境。
            比如App一个界面是属于Activity类型,也就是Android界面环境,
            但是当访问内嵌的网页是属于另外一个环境(网页环境),两者处于不同的一个环境。

            ###################################################################

            环境准备:
            1.App Webview开启debug模式,请开发人员在app中配置代码
            (在WebView类中调用静态方法setWebContentsDebuggingEnabled):
                if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {
                 WebView.setWebContentsDebuggingEnabled(true);
                }
            2.电脑端Chrome浏览器地址栏输入 chrome://inspect/#devices,进入调试模式。
                打开app的h5页面,chrome刷新,检查是否显示对应的webview。
            3.由于app的webview自动化是依赖于chromedriver的,所以appium中的chromedriver要跟
                手机的Android System WebView的版本对应起来,如Android System WebView为版本39,
                对应chromedriver版本为2.11~2.14均适配
            4.手机端Android System WebView在设置-全部应用里面查看版本号,appium 1.7以后
                默认安装在c盘,chromedriver位于C:\Program Files (x86)\Appium\resources\app
                \node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\,
                双击chromedriver.exe,即可看到版本号,如2.14
            5.到http://npm.taobao.org/mirrors/chromedriver/ 查看chromedriver版本2.14的notes.txt
                描述,是否支持手机的Android System WebView的版本,若不支持,就下载支持的版本,
                下载后的chromedriver.exe覆盖appium中的chromedriver,最后重启appium,必须重启。
            6.在原生APP定位时若看到class包含webview/view,或者获取上下文看到WEBVIEW_com.xxx,
                则说明是webview,切换后可使用web定位


            dr.contexts  查看上下文,返回列表
            dr.switch_to.context("xxx")  切换环境(切换到webview,切回到原生app)
            dr.current_context  查看当前环境
    

            # 演示APP为drfone_v3.2.0
            from appium import webdriver
            from time import sleep

            desired_caps = {
              "platformName": "Android",
              "platformVersion": "5.1.1",
              "deviceName": "127.0.0.1:62001",
              "appPackage": "com.wondershare.drfone",
              "appActivity": "com.wondershare.drfone.ui.activity.Main2Activity" }
            dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
            dr.implicitly_wait(10)  # 隐式等待10秒
            # 进入backup
            dr.find_element_by_id("com.wondershare.drfone:id/btnBackup").click()
            # 点击next
            dr.find_element_by_id("com.wondershare.drfone:id/btnRecoverData").click()

            # 查看上下文 dr.contexts     ["NATIVE_APP","WEBVIEW_xxxx"]
            contexts = dr.contexts
            print(contexts)

            # 切换到指定的webview
            # dr.switch_to.context("WEBVIEW_com.wondershare.drfone")
            dr.switch_to.context(contexts[1])
            sleep(1)

            # 打印切换后的环境
            print("切换后的环境是:",dr.current_context)

            # 输入邮箱地址,并提交
            dr.find_element_by_id("email").send_keys("juzi01@qq.com")
            dr.find_element_by_class_name("btn_send").click()

            # 切回原生APP页面
            # dr.switch_to.context("NATIVE_APP")
            dr.switch_to.context(contexts[0])

            # 继续在原生APP操作   ...


代码补充:

    在selenium中,我们获取文本的方法通常是find_element_by_id(id的值").text,
    但是对于div,dt这些标签,这个方法则获取不到的文本内容,如下:
    
            <div class="container">
                <dt> hello</dt>
                </div>

    对于div,dt这些标签,我们可以通过获取他的innerHTML属性来获取对应的文本:

        text = dr.find_element_css_selector('.container > dt').get_attribute("innerHTML")
        print(text)    →:hello

===========================================

app项目自动化测试框架

1.创建项目文件夹,如Appium自动化测试框架,

2.项目下创建common文件夹,

3.在common下创建desired_cap.py文件,配置APP启动时的信息

4.项目下创建base文件夹

5.在base下创建basePage.py文件,接收driver,封装基础方法,如find_element_by_id()等

6.在common下创建common.py文件,继承basePage.py,存放公共的操作,
    如点击元素,向输入框输入数据,滑动元素等,给业务模块进行继承,并调用其中的方法

7.项目下创建business文件夹,存放指定页面的业务操作,如查找、编辑、保存等操作,
    以及元素定位方式,给测试用例调用

8.在business下创建writeAccount.py文件

9.项目下创建testCases文件夹,存放测试用例

10.在testCases下创建testWriteAccount.py文件

---------------------------- 以下为登录相关
11.在business下创建login.py文件
12.在testCases下创建testLogin.py文件
13.项目下创建dataConfig文件夹,其下新建data.xlsx文件,在Excel里面配置测试数据
14.项目下创建util文件夹,其下新建operateExcel.py文件,操作Excel文件的读取、存放等

-------------------------封装unittest里面的setUp和tearDown(视情况而定)
15.在common下创建myUnittest.py文件,其下封装unittest里面环境准备和环境恢复

16.项目下创建reports文件夹,存放测试报告        

17.准备HTMLTestRunner.py和runAllCases.py文件,并将testCases下的顺序调整好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值