精华内容
下载资源
问答
  • IOS appium自动化测试python脚本
  • appium相关方法 (1)#**scroll(起始元素,结束元素)** driver.scroll(origin_el,destination_el) (2)#**屏幕向右滑动** def swipRight(driver,t=1000): l=getSize(driver) x1=int(l[0]*0.05) y1=int(l[1]*0.5) x2...

    appium相关方法

    1)#**scroll(起始元素,结束元素)**
    driver.scroll(origin_el,destination_el)2)#**屏幕向右滑动**
    def swipRight(driver,t=1000):
    l=getSize(driver)
    x1=int(l[0]*0.05)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.75)
    driver.swipe(x1,y1,x2,y1,t)3)#**获得屏幕大小宽和高
    def getSize(driver):
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return (x, y)4)#**MultiAction()//**多点触控
    MultiAction().add()添加多个TouchAction操作,最后调用perform()执行
    action0 = TouchAction().tap(el)
    action1 = TouchAction().tap(el)
    MultiAction().add(action0).add(action1).perform()5)#**driver.swipe(x1, y1, x2, y2,duration) **从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间**(滑动的坐标不能超过屏幕的宽高)
    #**driver退出、卸载、安装
    driver.quit()
    driver.install_app(apk path):安装app
    driver.remove_app(app package  name):卸载app
    driver.is_app_installed(app package  name):判断app是否已安装,已安装返回true6)#**关闭和启动app
    driver.close_app()
    driver.launch_app()
    如需跨app执行用例,则可使用start_activity(self, app_package, app_activity, **opts)方法
    (7)#**将app放置后台n秒,n秒后,页面自动回到前台
    driver.background_app( n  )
    #获取当前页面 和 启动指定页面
    driver.current_activity()
    driver.start_activity(包名,activity名)
    当前页面是登录页就登录,否则先打开登录页再登录
    (8)#**等待某个页面出现
    driver.wait_activity('.Activity',3,1):等待3秒,每1秒检查一次,页面出现则返回true9)#**截屏函数
    import time
    from appium import webdriver
    def captureScreen(self,filename):#传递图片文件名
     (10) #获取系统时间并转换格式作为图片名,20190830161035
     date=time.strftime("%Y%m%d%H%M%S",time.localtime())11) #拼接存储路径,电脑路径+时间+图片名+.png
     storeFile='E:/图片/'+date+filename+'.png'
     self.driver.get_screenshot_as_file(storeFile)12)#******放大图片*****
     srcHeight=self.driver.get_window_size()['height']
     srcWidth=self.driver.get_window_size()['width']13)#设置MultiAction,可以多点触控
     multiAction=MultiAction(self.driver)
    #设置两个“单点”动作
      t1=TouchAction(self.driver)
      t2=TouchAction(self.driver)
      #分成两点按住相片0.25s
      t1.long_press(imageView,srcWidth/2,srcHeight/2 - 100).wait(250).move_to(imageView,srcWidth/2,srcHeight/2-130).release()
      t2.long_press(imageView,srcWidth/2,srcHeight/2 + 100).wait(250).move_to(imageView,srcWidth/2,srcHeight/2+125).release(
     #Java方法,multiAction.add(t1).add(t2)
     multiAction.add(t1)
     multiAction.add(t2)
     multiAction.perform()14)#拖拽函数
    self.driver.drag_and_drop(musicBox,musicList)//musicBox拖拽的控件,musicBox要拖拽到的另一控件15)#TouchAction对象包含(tab)、press(短按)、move_to(滑动到某个坐标)等方法
    通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以实现解锁屏幕等功能
    规范中的可用事件有:
    * 短按 (press)
    * 释放 (release)
    * 移动到 (moveTo)
    * 点击 (tap)
    * 等待 (wait)
    * 长按 (longPress)
    * 取消 (cancel)
    * 执行 (perform)16)#设置网络类型setNetworkConnection(bitmask掩码)*
    例如:设置网络类型为只开wifi
    driver.set_network_connection(2)#1 (飞行模式)4 (只有数据连接)6 (开启所有网络) |
    #**newCommandTimeout:**设置未接收到新命令的超时时间,默认60s
    如果60s内没有接收到新命令,appium会自动断开连接,可延长接收新命令的超时时间
    desired_caps["newCommandTimeout"]=180017)#test suite测试套件
    TestSuite(测试套件):实际上就是测试集,测试用例的集合,将我们需要执行的测试用例添加到测试集中,然后再一键执行。
    TextTestRunner :用来执行测试用例集,TestCase和TestSuite本身也有自己执行用例的方法,不过TextTestRunner在实际应用中优于它们,使用方法:
    1) suite = unittest.TestSuite() #TestSuite是个类,首先将它实例化,创建一个对象,然后用对象调用它的 addTest 方法
    suite.addTest(TestMath('test_add'))  # 添加测试用
    suite.addTest(TestMath('test_sub'))  
    suite.addTest(TestMath('test_multiply'))  
    suite.addTest(TestMath('test_divide'))  # 添加测试用例
     run = unittest.TextTestRunner(verbosity=2)# 创建个TextTestRunner对象,用对象调用run()方法,注意对象传参 verbosity=2 可以控制测试报告的详细程度,verbosity 有 0 1 2 三个级别,verbosity=2 的输出最详细
        run.run(suite)  # 执行 suite 用例集
    2)suite = unittest.TestLoader().loadTestsFromTestCase(ComplexAndroidTests)#
    ComplexAndroidTests测试类
      unittest.TextTestRunner(verbosity=2).run(suite)18)#******键盘操作*****
    driver.keyevent() #括号里填入的是手机物理按键的数字代号
    driver.press_keycode()# 括号里填入的是键盘按键的数字代号
    参考博客:https://www.cnblogs.com/xiaobaixiaobai/p/10760943.html
    
    
    展开全文
  • from appium import webdriver import time desired_caps = {} desired_caps['platformName'] = 'Android' #使用哪个移动操作系统平台 iOS,Android或FirefoxOS desired_caps['platformVersion'] = '10' #移


    appium获取包名和activity

    最准确的是下面这种方法:

    命令行中输入:

    adb shell dumpsys activity activities
    

    输出后在前面的信息中查找:

    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.chenhon.xmkt.inst/com.chenhon.app.views.home.WelcomeActivity}

    在cmp中:cmp=com.jiejing.xmkt.inst/com.jiejing.app.views.home.WelcomeActivity

    com.chenhon.xmkt.inst为package,com.chenhon.app.views.home.WelcomeActivity为启动app的activity

    只需要搜索cmp,再查看cpm后面的包名和activity
    若还没有再查看com,看看有没有合适的

    打开应用例子

    # coding=utf-8
    
    from appium import webdriver
    import time
    
    desired_caps = {}
    
    desired_caps['platformName'] = 'Android'   #使用哪个移动操作系统平台  iOS,Android或FirefoxOS
    
    desired_caps['platformVersion'] = '10'  #移动操作系统版本  例如7.14.4
    
    desired_caps['deviceName'] = 'Android Emulator' #使用的移动设备或模拟器的种类  iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,等....在iOS上,这应该是与仪器返回的有效设备之一instruments -s devices。在Android上,这个功能目前被忽略,尽管它仍然是必需的。
    
    desired_caps['appPackage'] = 'com.xiaomi.shop' #你想运行的Android应用程序的Java包  com.example.android.myApp, com.android.settings
    # com.miui.calculator
    
    desired_caps['noReset'] = 'true' #在此会话之前不要重置应用程序状态。 true, false
    desired_caps['autoGrantPermissions'] = 'true' #让Appium自动确定您的应用程序需要哪些权限,并在安装时将其授予应用程序。默认为false
    
    desired_caps['appActivity'] = 'com.xiaomi.shop2.activity.MainActivity' #要从包中启动的Android活动的活动名称。这往往需要在一个.(例如,.MainActivity而不是MainActivity)
    
    print('连接到手机')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    try:
        print('进入')
        time.sleep(5)
        print('点击智造新生活')
        newlife = driver.find_element_by_id('com.xiaomi.shop.plugin.homepage:id/home_hot_zone_view').click()
        time.sleep(5)
        print('循环点击抢卷')
        for i in range(100):
            discopt = driver.find_element_by_id('com.xiaomi.shop2.plugin.hdchannel:id/iv_coupon').click()
    except:
        pass
    
    time.sleep(10)
    driver.quit()
    

    坐标位置点击

    ​# 前言:
    有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)
    那就拿出绝招:点元素所在位置的坐标

    tap用法

    1.tap是模拟手指点击,一般页面上元素
    的语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位毫秒

    tap(self, positions, duration=None):
    
        Taps on an particular place with up to five fingers, holding for a certain time
        
        模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
        
        :Args:
        
        - positions - list类型,里面对象是元组,最多五个。如:[(100, 20), (100, 60)]
        
        - duration - 持续时间,单位毫秒,如:500
        
        :Usage:
        
        driver.tap([(100, 20), (100, 60), (100, 100)], 500)
    

    坐标定位

    1.如下图定位"去看看"这个按钮的坐标,可以看到右侧bonds属性:[374,831][654,906]
    2.点右上角"搜索"按钮,查看bonds属性:[615,52][690,146]

    参考案例

    # coding:utf-8
    from appium import webdriver
    from time import sleep
    desired_caps = {
                    'platformName': 'Android',
                    'deviceName': '127.0.0.1:62001',
                    'platformVersion': '4.4.2',
                    'appPackage': 'com.baidu.yuedu',
                    'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
                    }
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    sleep(5)
    

    点弹出框去看看

    driver.tap([(374, 831), (654, 906)], 500)
    

    返回上一页

    driver.back()
    sleep(2)
    

    点右上角搜素按钮

    driver.tap([(615, 52), (690, 146)], 500)
    

    弊端
    通过坐标定位是元素定位的下下下策,实在没办法才用这个,另外如果换了手机分辨率,这个坐标就不能写死了,得算出所在屏幕的比例。

    滑动屏幕

    在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕。

    swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标。
    先看下 swipe 方法定义:

    def swipe(self, start_x, start_y, end_x, end_y, duration=None):
            """Swipe from one point to another point, for an optional duration.
    
            Args:
                start_x (int): x-coordinate at which to start
                start_y (int): y-coordinate at which to start
                end_x (int): x-coordinate at which to stop
                end_y (int): y-coordinate at which to stop
                duration (:obj:`int`, optional): time to take the swipe, in ms.
    
            Usage:
                driver.swipe(100, 100, 100, 400)
    
            Returns:
                `appium.webdriver.webelement.WebElement`
            """
    

    start_x:开始坐标 x 轴

    start_y:开始坐标 y 轴

    end_x:结束坐标 x 轴

    end_y:结束坐标 y 轴

    duration:开始坐标移动到结束坐标的时间,默认 None

    一段简单的代码:

    from appium import webdriver
    
    desired_caps = {
                    'platformName': 'Android',
                    'deviceName': '192.168.41.101:5555',
                    'platformVersion': '9.0',
                    # apk包名
                    'appPackage': 'com.gem.tastyfood',
                    # apk的launcherActivity
                    'appActivity': 'com.gem.tastyfood.LaunchActivity'
                    }
    
    if __name__=='__main__':
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        x = driver.get_window_size()["width"]
        y = driver.get_window_size()["height"]
        #向左滑动
        driver.swipe(x*0.9,y*0.5,x*0.1,y*0.5,duration=2000)
    

    可以将 左滑、右滑、上滑、下滑 写成方法,方便调用:

     from appium import webdriver
    
    desired_caps = {
                    'platformName': 'Android',
                    'deviceName': '192.168.41.101:5555',
                    'platformVersion': '9.0',
                    # apk包名
                    'appPackage': 'com.gem.tastyfood',
                    # apk的launcherActivity
                    'appActivity': 'com.gem.tastyfood.LaunchActivity'
                    }
    
    # 向左滑动。y轴保持不变,X轴:由大变小
    def swipe_left(driver,star_x=0.9,stop_x=0.1,duration=2000):
        x1 = int(x*star_x)
        y1 = int(y*0.5)
        x2 = int(x*stop_x)
        y2 = int(y*0.5)
        driver.swipe(x1,y1,x2,y2,duration)
    
    # 向右滑动。y轴保持不变,X轴:由小变大
    def swipe_right(driver,star_x=0.1,stop_x=0.9,duration=2000):
        x1 = int(x*star_x)
        y1 = int(y*0.5)
        x2 = int(x*stop_x)
        y2 = int(y*0.5)
        driver.swipe(x1,y1,x2,y2,duration)
    
    # 向上滑动。x轴保持不变,y轴:由大变小
    def swipe_up(driver,star_y=0.9,stop_y=0.1,duration=2000):
        x1 = int(x*0.5)
        y1 = int(y*star_y)
        x2 = int(x*0.5)
        y2 = int(y*stop_y)
        driver.swipe(x1,y1,x2,y2,duration)
    
    # 向下滑动。x轴保持不变,y轴:由小变大
    def swipe_down(driver,star_y=0.1,stop_y=0.9,duration=2000):
        x1 = int(x*0.5)
        y1 = int(y*star_y)
        x2 = int(x*0.5)
        y2 = int(y*stop_y)
        driver.swipe(x1,y1,x2,y2,duration)
    
    
    if __name__=='__main__':
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        x = driver.get_window_size()["width"]
        y = driver.get_window_size()["height"]
        swipe_left(driver)
        swipe_right(driver)
        swipe_up(driver)
        swipe_down(driver)
    

    获取text

    # 获取text
    t1 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").text
    print(t1)
    

    获取tag_name(实质上就是class)

    # 获取tag_name
    t2 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").tag_name
    print(t2)
    

    获取属性的内容(get_attribute)

    1.获取content-desc属性,这里注意了,如果content-desc属性为空,那么获取的就是text属性,不为空获取的才是content-desc属性

    # content-desc为空,获取的是text
    t3 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("name")
    print(t3)
    

    id,calss,text属性获取

    # id
    t5 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("resourceId")
    print(t5)
    
    # class
    t6 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("className")
    print(t6)
    
    # text
    t7 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("text")
    print(t7)
    
    5.其它属性获取,注意这里并不是所有的都可以获取,一些标准的属性是可以获取到的
    
    # checkable
    t8 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("checkable")
    print t8
    
    # clickable
    t9 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("clickable")
    print t9
    

    size和location

    1.获取size,返回的是字典,如:{‘width’: 84, ‘height’: 84}

    2.获取location,返回的是字典,如:{‘y’: 38, ‘x’: 192}

    # size
    t10 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").size
    print t10
    
    # location
    t11 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").location
    print t11
    

    等主页面activity出现

    driver.wait_activity(".base.ui.MainActivity", 10)
    
    展开全文
  • python会遇到python+appium自动化测试中toast定位,直接上代码,更方便理解
  • python+appium自动化测试-参数化读取外部excel文件

    读取外部的excel文件有三种方法,包括:pandas、xlrd、openpyxl,excel文件包括后缀为xls和xlsx的文件,这篇文章分别使用pandas和openpyxl读取外部的excel文件。来自APP Android端自动化测试初学者的笔记,写的不对的地方大家多多指教哦。

    一、pandas

    pandas读取后缀名为.xls和.xlsx的excel文件所用的方法是一致的

    1.安装:pip3 install pandas

    安装成功显示
    在这里插入图片描述
    2.读取excel文件的内容

    需要用到的excel表格及数据
    在这里插入图片描述
    使用pandas读取外部表格需要导入pandas包

    import pandas as pd
    
    def pd_read_excel():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
    
        # 使用pandas.read_excel()方法读取传入的文件,加sheet_name=None,读取出所有的sheet
        st_data = pd.read_excel(path, sheet_name=None)
        # 1.输出所有子表的名称,list列表形式展现
        print(list(st_data))
        # 2.控制台直接输出
        for i in st_data.keys():
            print(i)
    

    输出结果为:

    (1)list列表形式展现
    在这里插入图片描述
    (2)直接输出
    在这里插入图片描述

    import pandas as pd
    
    def pd_read_excel():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
    
        # 1.sheet_name默认显示为0,表示返回第一张子表,读取表的所有数据(包括列名)
        st_data = pd.read_excel(path, sheet_name=0)
        # 读取第一张表所有数据(list形式)
        print(st_data.values)
    
        # 2.sheet_name定义为子表名称,表示返回“test_sheet1”子表,读取表的所有数据
        st_data = pd.read_excel(path, sheet_name="test_sheet1")
        # 读取test_sheet1表所有数据(list形式)
        print(st_data.values)
    

    输出结果为:
    在这里插入图片描述

    import pandas as pd
    
    def pd_read_excel():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"		
    
        # 1.读取表中固定列的数据(不包括列名)
        st_data = pd.read_excel(path, sheet_name="test_sheet1", usecols=[1])
        # 读取book表的第一列数据(list形式)
        print(st_data.values)
    
        # 2.读取表中1.3列的数据(不包括列名)
        st_data = pd.read_excel(path, sheet_name="test_sheet1", usecols=[1, 3])
        # 读取book表第一、三列数据(list形式)
        print(st_data.values)
    
    import pandas as pd
    
    def pd_read_excel():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"		
    
    	# 读取表中固定行的数据
        st_data = pd.read_excel(path, sheet_name="test_sheet1", nrows=1)
        # 1.读取book表第一行的数据(data Frame结构)
        print(st_data.head())
        # 2.读取book表所有数据(list形式)
        print(st_data.values)
    

    二、openpyxl

    1.安装:pip install openpyxl

    安装成功显示
    在这里插入图片描述
    2.读取excel文件的内容

    需要用到的excel表格及数据
    在这里插入图片描述
    使用openpyxl读取外部表格需要导入openpyxl包,以下例子中只识别.xlsx文件

    import openpyxl
    
    def opl_read_xlsx():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
        st_data = openpyxl.load_workbook(path)
    
        # 1.读取所有子表
        print(st_data.worksheets)
        # 2.使用索引获取单个子表
        sheet = st_data.worksheets[0]
        print(sheet)
        # 3.active是表示被激活的表单,被选择的sheet,打开文件默认那个表单(默认为第一个表单)
        active_sheet = st_data.active
        print(active_sheet)
        # 4.正规用法,通过名字进行索引
        sheet = st_data["test_sheet2"]
        print(sheet)
    

    (1)输出结果为:
    在这里插入图片描述
    (2)输出结果为:
    在这里插入图片描述
    (3)输出结果为:
    在这里插入图片描述
    (4)输出结果为:
    在这里插入图片描述

    import openpyxl
    
    def opl_read_xlsx():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
        st_data = openpyxl.load_workbook(path)
    
        # 获取某一行
        sheet = st_data["test_sheet2"]
        columns = sheet[2]
        # 获取某一行的值,由于获取到的column相当于单元格对象,所以遍历单元格对象,再使用value来获取单元格内的值
        for column in columns:
            print(column.value)
    

    输出结果为:
    在这里插入图片描述

    import openpyxl
    
    def opl_read_xlsx():
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
        st_data = openpyxl.load_workbook(path)
    
        # 获取某一列
        sheet = st_data["test_sheet2"]
        rows = sheet["B"]
        # 获取某一列的值,由于获取到的rows相当于单元格对象,所以遍历单元格对象,再使用value来获取单元格内的值
        for row in rows:
            print(row.value)
    

    输出结果为:
    在这里插入图片描述

    三、封装pandas获取外部文件类,用于python+appium自动化测试

    1.该类主要实现使用pandas获取外部的excel表固定列的内容,类名为:get_excel_data.py

    # 封装获取外部excel文件内容
    import pandas as pd
    
    class GetExcelData:
        # 初始化,外部传入一个path参数
        def __init__(self, path: ''):
            self.path = path
    
        # 使用pandas读取外部excel文件
        def pd_read_excel(self, path):
            # 读取excel文件中的子表test_sheet1的第二列的内容,列下表从0开始
            st_data = pd.read_excel(path, sheet_name="test_sheet1", usecols=[1])
            # 读取test_sheet1表的第一列数据(list形式)
            data = st_data.values
            return data
    
    # 测试函数,执行过程中可以注释
    # if __name__ == '__main__':
    #     path = "E:\\study\\Fork\\other_file\\test.xlsx"
    #     a = GetExcelData(path)
    #     a.pd_read_excel(path)
    

    2.该类主要用于调用get_excel_data表

    # 调用get_excel_data表
    from utils.get_excel_data import GetExcelData
    
    class TestOne:
        # 需要读取的文件的路径
        path = "E:\\study\\Fork\\other_file\\test.xlsx"
        driver: webdriver = None
    
        def __init__(self, driver):
            super().__init__(driver)
            self.excel_data = GetExcelData(self.driver)
    
        def test_01(self):
    	# 获取excel文件的内容
            search_contexts = self.excel_data.pd_read_excel(self.path)
    

    一个用心码了这么多文字的人,往往渴望得到大家的认可。如果你觉得这篇文章对你有帮助,双击屏幕,给我点个赞呀!

    更多软件测试资源分享微信公众号:【程序员一凡】
    软件测试技术交流群:1079636098
    在这里插入图片描述

    展开全文
  • 前面 Appium 自动化测试框架大概发的都差不多了,那么接下来分享有关 Appium 自动化测试框架的综合实践,想必有些小伙伴都等不及了吧! 1、driver配置封装 kyb_caps.yaml 配置表 ,主要是一些配置信息的封装。 代码...

    Time will tell.

    前面 Appium 自动化测试框架大概发的都差不多了,那么接下来分享有关 Appium 自动化测试框架的综合实践,想必有些小伙伴都等不及了吧!

    1、driver配置封装

    kyb_caps.yaml 配置表 ,主要是一些配置信息的封装。

    代码:

    platformName: Android
    #模拟器
    platformVersion: 5.1.1
    deviceName: 127.0.0.1:62025
    
    #mx4真机
    #platformVersion: 5.1
    #udid: 750BBKL22GDN
    #deviceName: MX4
    
    appname: kaoyan3.1.0.apk
    noReset: False
    unicodeKeyboard: True
    resetKeyboard: True
    
    appPackage: com.tal.kaoyan
    appActivity: com.tal.kaoyan.ui.activity.SplashActivity
    ip: 127.0.0.1
    port: 4723
    

    desired_caps.py,主要是用来读取配置文件的信息的封装。

    代码:

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    # 2.注释:包括记录创建时间,创建人,项目名称。
    # 3.导入模块
    
    from appium import webdriver
    import yaml
    import logging
    import logging.config
    import os
    
    CON_LOG='../config/log.conf'
    logging.config.fileConfig(CON_LOG)
    logging=logging.getLogger()
    
    def appium_desired():
        with open('../config/kyb_caps.yaml','r',encoding='utf-8') as file:
            data=yaml.load(file)
    
        desired_caps={}
        desired_caps['platformName']=data['platformName']
        desired_caps['platformVersion']=data['platformVersion']
        desired_caps['deviceName']=data['deviceName']
    
        base_dir = os.path.dirname(os.path.dirname(__file__))
        app_path = os.path.join(base_dir, 'app', data['appname'])
        desired_caps['app']=app_path
    
        desired_caps['appPackage']=data['appPackage']
        desired_caps['appActivity']=data['appActivity']
        desired_caps['noReset']=data['noReset']
    
    
        desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
        desired_caps['resetKeyboard']=data['resetKeyboard']
    
        logging.info('start app...')
        driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
        driver.implicitly_wait(8)
        return driver
    
    if __name__ == '__main__':
        appium_desired()
    
        # with open('../config/kyb_caps.yaml', 'r', encoding='utf-8') as file:
        #     data = yaml.load(file)
        #
        # base_dir=os.path.dirname(os.path.dirname(__file__))
        # print(os.path.dirname(__file__))
        # print(base_dir)
        #
        # app_path=os.path.join(base_dir,'app',data['appname'])
        # print(app_path)
    

    相对路径符号含义

    • “.” 表示当前目录

    • “…” 表示当前目录的上一级目录。

    • “./” 表示当前目录下的某个文件或文件夹,视后面跟着的名字而定

    • “…/” 表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。

    2、基类封装

    baseView.py,主要是一些元素定位方法的封装。

    代码:

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    # 2.注释:包括记录创建时间,创建人,项目名称。
    # 3.导入模块
    
    class BaseView(object):
        def __init__(self,driver):
            self.driver=driver
    
        def find_element(self,*loc):
            return self.driver.find_element(*loc)
    
        def find_elements(self,*loc):
            return self.driver.find_elements(*loc)
    
        def get_window_size(self):
            return self.driver.get_window_size()
    
        def swipe(self,start_x, start_y, end_x, end_y, duration):
            return self.driver.swipe(start_x, start_y, end_x, end_y, duration)
    

    3、common 公共模块封装

    公共方法封装 : common_fun.py,主要是一些公共方法的封装。

    代码:

    # coding=utf-8
    # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
    # 2.注释:包括记录创建时间,创建人,项目名称。
    # 3.导入模块
    
    from kyb_testProject.baseView.baseView import BaseView
    from kyb_testProject.common.desired_caps import appium_desired
    from selenium.common.exceptions import NoSuchElementException
    import logging
    from selenium.webdriver.common.by import By
    import time,os
    import csv
    
    class Common(BaseView):
        cancelBtn=(By.ID,'android:id/button2')
        skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip')
        wemedia_cacel=(By.ID,'com.tal.kaoyan:id/view_wemedia_cacel')
    
    
        def check_cancelBtn(self):
            logging.info('==========check_cancelBtn=========')
            try:
                cancelBtn = self.driver.find_element(*self.cancelBtn)
            except NoSuchElementException:
                logging.info('no cancelBtn')
            else:
                cancelBtn.click()
    
        def check_skipBtn(self):
            logging.info('=========check skipBtn=============')
    
            try:
                skipBtn = self.driver.find_element(*self.skipBtn)
            except NoSuchElementException:
                logging.info('no skipBtn')
            else:
                skipBtn.click()
    
        def get_size(self):
            x = self.driver.get_window_size()['width']
            y = self.driver.get_window_size()['height']
            return x, y
    
        def swipeLeft(self):
            logging.info('swipeLeft')
            l = self.get_size()
            x1 = int(l[0] * 0.9)
            y1 = int(l[1] * 0.5)
            x2 = int(l[0] * 0.1)
            self.swipe(x1, y1, x2, y1, 1000)
    
        def getTime(self):
            self.now=time.strftime("%Y-%m-%d %H_%M_%S")
            return self.now
    
        def getScreenShot(self,module):
            time=self.getTime()
            image_file=os.path.dirname(os.path.dirname(__file__))+'/screenshots/%s_%s.png' %(module,time)
    
            logging.info('get %s screenshot' %module)
            self.driver.get_screenshot_as_file(image_file)
    
        def check_market_ad(self):
            logging.info('====check_market_ad====')
            try:
                element=self.driver.find_element(*self.wemedia_cacel)
            except NoSuchElementException:
                pass
            else:
                logging.info('close market ad')
                element.click()
    
        def get_csv_data(self,csv_file,line):
            logging.info('=====get_csv_data======')
            with open(csv_file,'r',encoding='utf-8-sig') as file:
                reader=csv.reader(file)
                for index,row in enumerate(reader,1):
                    if index==line:
                        return row
    
    if __name__ == '__main__':
        # driver=appium_desired()
        # com=Common(driver)
        # com.check_cancelBtn()
        # # com.check_skipBtn()
        # com.swipeLeft()
        # com.getScreenShot('startApp')
    
        list = ["这", "是", "一个", "测试", "数据"]
        # for i in range(len(list)):
            # print(i, list[i])
    
        list1 = ["这", "是", "一个", "测试", "数据"]
        # for index, item in enumerate(list1):
        #     print(index, item)
    

    好了,今天的分享就到这里。如果你对更多内容、Python自动化软件测试、面试题感兴趣的话可以加入我们175317069一起学习。群里会有各项测试学习资源发放,更有行业深潜多年的技术人分析讲解。

    祝你能成为一名优秀的软件测试工程师!

    欢迎【点赞】、【评论】、【关注】~

    Time will tell.(时间会证明一切)

    展开全文
  • 借助Appium做移动端自动化测试的开发环境搭建,Python环境:Appium+Pycharm+Unittest
  • <p>python try命令自测和if命令自测的区别</p>
  • python+appium的环境依赖 Node.js Appium Appium-desktop ...以上是appium自动化所需要的全部环境 Node.js 下载地址:https://nodejs.org/en/download/releases/ 这里注意一个问题:Node.js版本...
  • Python环境下Ride自动化测试实践,通过robotframework以及最新的appiumdesktop连接真机实现安卓的自动化测试,里面整合了一部分网上大神的笔记,清晰搭建流程,真实可用
  • Python+Appium自动化测试(5)-appium元素定位常用方法 对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor。之前已经介绍过了weditor的使用,这里我将通过使用...
  • 我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就...具体的获取方法请参考APP自动化测试appium连接真机启动app,配置信息如下: { "platformName": "Android", "platformVersion": "10
  • python+unnitest+appium自动化测试框架: 以下是本篇文章正文内容,下面案例可供参考 一、python是什么? Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,054
精华内容 821
关键字:

appium自动化测试python

python 订阅