zoukankan      html  css  js  c++  java
  • appium自动化基础总结

    ---恢复内容开始---

    断断续续学了2周appium自动化,把经常用到基础写出来吧!方便日后便于查看。

    appium解决中文无法输入和,启动app自动清除数据的问题。在前置代码里面加上这3句就可以解决。

    desired_caps = {

        "unicodeKeyboard": "True",  # 使用unicode输入法
    "resetKeyboard": "True", # 重置输入法到初始状态
      
    "noReset": "True", # 解决启动app自动清除数据的问题,加这句让app启动不清除原有数据
    }

    安装apk到手机


    driver.install_app("D:\\download\\38193ab216f29fdc9243bd8c39b65f95.apk") #后面跟apk路径

    移除app
    driver.remove_app('com.ibox.calculators') #参数填包名
    判断app是否安装在手机上,参数填包名
    result = driver.is_app_installed('com.ibox.calculators')

    获取当前页面的文档结构,用来做断言
    print(driver.page_source)

    断言元素是否存在页面中
    if '更多' in driver.page_source:
    print('成功,存在')
    else:
    print('错误,不存在')

    隐式等待
    driver.implicitly_wait(30)


    获取包名和appActivity

    1,先打开获取包名的app
    2,adb shell
    3, dumpsys activity | grep mFocusedActivity 获取到包名和
    appActivity

    获取屏幕大小
    size = driver.get_window_size()


    定位方法截图:


    后续补充的代码
    # todo 实现appium1.9版本自动登录美逛的功能
    from appium import webdriver
    import time
    
    
    class OpenMg():
        '''自动登录美逛app'''
    
        def __init__(self):
            '''打开APP及初始化工作'''
            desired_caps = {
                "platformName": "Android",
                "platformVersion": "5.1",
                "deviceName": "127.0.0.1:62001",
                "appPackage": "com.xk.span.zutuan",
                "appActivity": ".module.main.ui.activity.MainActivity",
                # "appWaitActivity": ".module.main.ui.activity.MainActivity",
                "unicodeKeyboard": "True",  # todo 屏蔽键盘,解决appium不能输入中文的问题
                "resetKeyboard": "True",
                 "noReset":"True"     # todo 启动app时不要清除app里的原有的数据
            }
            self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
            self.driver.implicitly_wait(30)
    
        def slide_pafe(self):
            '''实现界面滑动的功能'''
    
            # todo swipe参数说明,(x轴起始位置,y轴起始,x轴结束,y轴结束,最后一个参数是滑动速度,可不填)
            '''
            # todo 从下往上滑,起始y1比结束坐标y2大,差距越大,滑动距离越大,
            # TODO 从上往下滑,起始y1比结束坐标y2小,差距越大,滑动距离越大
            # todo 从左往右滑,起始x1比结束坐标x2大,差距越大,滑动距离越大
            # TODO 从右往左滑,起始x1比结束坐标x2小,差距越大,滑动距离越大
            '''
            # 滑动首页图片进入首页
            for i in range(4):
                self.driver.swipe(972, 386, 108, 386, 500)
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_class_name('android.widget.ImageView').click()
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_id('com.xk.span.zutuan:id/image_canclePlay').click()
            self.driver.implicitly_wait(30)
    
        def register_page(self):
            '''由注册切换到输入账号界面'''
            self.driver.find_element_by_id('com.xk.span.zutuan:id/tv_tab_txt4').click()
            self.driver.find_element_by_id('com.xk.span.zutuan:id/stv_user_un_login').click()
            self.driver.find_element_by_id('com.xk.span.zutuan:id/stv_login_mobile').click()
    
        def input_account(self, phone, password):
            '''输入账号密码到首页界面'''
            self.phone = phone
            self.driver.find_element_by_id('com.xk.span.zutuan:id/et_mobile').send_keys(phone)
            self.driver.find_element_by_id('com.xk.span.zutuan:id/password').click()
            self.driver.find_element_by_id('com.xk.span.zutuan:id/et_password').send_keys(password)
            self.driver.find_element_by_xpath('//*[@text="登录"]').click()
            time.sleep(0.3)
    
        def switch(self):
            '''首页切换到个人中心'''
            self.driver.find_element_by_xpath('//*[@text="个人中心"]').click()
            time.sleep(0.3)
    
        def finally_result(self):
            '''断言结果是否正确,账号是否在当前元素界面'''
            if self.phone in self.driver.page_source:
                print('账号正确,登录成功')
            else:
                print('账号错误,登录失败')
    
        def click_exit(self):
            '''点击退出,清理登录信息'''
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_id('com.xk.span.zutuan:id/iv_user_logout').click()
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_xpath('//*[@text="确定"]').click()
            time.sleep(1)
    
        def closed(self):
            '''关闭驱动对象'''
            time.sleep(1)
            self.driver.quit()
    
    
    def run1():
        '''根据操作顺序,调用方法执行'''
        mg = OpenMg()
        mg.slide_pafe()
        mg.register_page()
        mg.input_account('1582', 'mg123456')
        mg.switch()
        mg.finally_result()
        mg.click_exit()
        mg.closed()
    
    
    class SearchGoods(OpenMg):
        '''搜索商品'''
    
        def input_goods(self, content):
            '''操作搜索框及输入商品搜索'''
            self.content = content
            self.driver.find_elements_by_class_name('android.widget.TextView')[0].click()
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_xpath('//*[@text="搜索关键词或粘贴淘宝标题"]').send_keys(self.content)
            time.sleep(0.5)
            self.driver.find_element_by_id('com.xk.span.zutuan:id/tv_search_submit').click()
            # self.driver.swipe(108, 1800, 108, 200, 500)
            # self.driver.swipe(108, 200, 108, 800, 500)
            time.sleep(1)
    
        def finally_result(self):
            '''断言结果是否正确,账号是否在当前元素界面'''
            if self.content in self.driver.page_source:
                print('搜索商品正确,测试成功')
            else:
                print('搜索商品错误,测试失败')
            self.driver.implicitly_wait(30)
    
            # super().closed()
    
        def home_pege(self):
            '''搜索界面返回到首页'''
            self.driver.find_element_by_id('com.xk.span.zutuan:id/iv_back').click()
            self.driver.find_element_by_id('com.xk.span.zutuan:id/iv_back').click()
    
    
    def run2():
        '''根据操作顺序调用方法执行'''
        sg = SearchGoods()
        sg.slide_pafe()
        sg.register_page()
        sg.input_account('158', 'mg123456')
        sg.input_goods('短袖')
        sg.finally_result()
        sg.home_pege()
        sg.switch()
        sg.click_exit()
        sg.closed()
    
    
    class Filter_Goods(SearchGoods):
        '''筛选商品'''
    
        def filter(self,price1,price2):
            '''对筛选框的操作'''
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_xpath('//*[contains(@text,"筛选")]').click()
            self.driver.find_element_by_xpath('//*[contains(@text,"最低价")]').send_keys(price1)
            self.driver.find_element_by_xpath('//*[contains(@text,"最高价")]').send_keys(price2)
            self.driver.implicitly_wait(30)
            self.driver.find_element_by_id('com.xk.span.zutuan:id/ok').click()
    
    
    def run3():
        fg = Filter_Goods()
        fg.slide_pafe()
        fg.register_page()
        fg.input_account('1582', 'mg123456')
        fg.input_goods('书包')
        fg.filter(30,100)
        fg.finally_result()
        fg.home_pege()
        fg.switch()
        fg.click_exit()
        fg.closed()
    
    
    def main():
        run1()
        run2()
        run3()
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    Oracle之:Function :dateToNumber()
    Oracle之:Function :getcurrdate()
    Oracle之:Function :getdate()
    Hadoop-No.15之Flume基于事件的数据收集和处理
    Hadoop-No.14之文件传输的特点
    Hadoop-No.13之数据源系统以及数据结构
    Hadoop-No.12之数据采集的时效性
    Hadoop-No.11之元数据
    Hadoop-No.10之列簇
    Hadoop-No.9之表和Region
  • 原文地址:https://www.cnblogs.com/xiamaojjie/p/11442336.html
Copyright © 2011-2022 走看看