python+appium app自动化的方法实例运用

22 篇文章 1 订阅
16 篇文章 1 订阅
# -*- coding: utf-8 -*-
import os
import sys
import time
import unittest

from appium import webdriver
# from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
from appium.webdriver.common.touch_action import TouchAction


global driver


class MyTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 初始化测试平台
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '6.0'
        desired_caps['deviceName'] = '78d358ad'
        desired_caps['appPackage'] = 'com.wochacha'
        desired_caps['appActivity'] = 'com.wochacha.StartupActivity'
        # desired_caps['appWaitActivity'] = ''
        desired_caps["unicodeKeyboard"] = "True"  # 输入中文
        desired_caps["resetKeyboard"] = "True"    # 输入中文

        cls.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
        # if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {WebView.setWebContentsDebuggingEnabled(true);}
        # cls.driver.implicitly_wait(8)
        time.sleep(8)

    def test_home_page(self):
        """首页原生页面和H5页面切换"""
        time.sleep(2)
        print(self.driver.contexts)
        contexts = self.driver.contexts
        self.driver.switch_to.context(contexts[1])  # 切换到H5页面
        time.sleep(2)
        print(self.driver.current_context)
        self.driver.switch_to.context("NATIVE_APP")  # 切换到原生页面

    def test_native_h5(self):
        """首页原生页面和H5页面切换"""
        # 注意切换H5的webview页面时,先打印下context,看是否有H5页面
        # 因为有的H5页面没有开启debug模式的话,即使有h5页面也无法切换
        # 解决方法,需要开发同学打一个测试包,加上一段调试的代码
        print(self.driver.context)
        print(self.driver.contexts)  # 打印所有上下文
        print(self.driver.current_context)
        print(self.driver.current_activity)  # 打印当前的activity
        self.driver.switch_to.context("NATIVE_APP")  # 切换到原生页面
        self.driver.switch_to.context("WEBVIEW_com.android.browser")  # 切换到H5页面

    def test_find_element(self):
        """定位元素方法"""
        self.driver.find_element_by_id("id")  # id定位
        self.driver.find_element_by_name("name")  # name定位
        self.driver.find_element_by_link_text("text")  # 链接名定位
        self.driver.find_element_by_partial_link_text("text")  # 通过元素部分可见链接文本定位
        self.driver.find_element_by_tag_name("name")  # 通过查找html的标签名称定位元素
        self.driver.find_element_by_xpath("xpath")  # 路径定位
        self.driver.find_element_by_class_name("android.widget.LinearLayout")  # 类名定位
        self.driver.find_element_by_css_selector("css")  # css选择器定位

    def test_find_elements_list(self):
        """定位元素复数集合方法"""
        self.driver.find_elements_by_id("id")  # id元素集合
        self.driver.find_elements_by_name("name")  # name元素集合
        self.driver.find_elements_by_link_text("text")  # 链接名元素集合
        self.driver.find_elements_by_partial_link_text("text")  # 部分元素可见链接集合
        self.driver.find_elements_by_tag_name("name")  # html标签名集合
        self.driver.find_elements_by_xpath("xpath")  # 路径定位集合
        self.driver.find_elements_by_class_name("android.widget.LinearLayout")  # 类名定位集合
        elements = self.driver.find_elements_by_css_selector("css")  # css选择器定位集合
        elements[0].click()  # 选择复数集合里面第几个来进行定位

    def test_element_action(self):
        """元素操作方法"""
        element = self.driver.find_element_by_id("id")
        element.click()  # 点击
        element.clear()  # 清除元素内容
        element.text()  # 返回元素的文本内容
        element.submit(self)  # 提交表单
        element.is_enabled()  # 元素是否可用
        element.is_slected()  # 元素是否可选
        element.is_displayed()       # 元素是否可见
        element.send_keys("中英+selenium")  # 输入方法

    def test_swipe_all(self):
        """滑动方法汇总"""
        self.driver.swipe(500, 1700, 500, 100, 500)  # 向上滑动(坐标滑动可能不是很稳定)

        el1 = self.driver.find_element_by_name("商品黑榜")
        el2 = self.driver.find_element_by_name("曝光栏")
        self.driver.scroll(el1, el2)       # 从一个元素滑到另一个元素  稳定,推荐这个
        TouchAction(self.driver).press(el1).move_to(el2).release().perform()  # 从一个元素滑到另一个元素

        # 连续滑动,可以用作滑动屏幕解锁
        TouchAction().press(el1).move_to(el2).move_to(el3).move_to(el4).release().perform()  # 连续坐标滑动
        TouchAction(self.driver).press(x, y).move_to(x, y).move_to(x, y).move_to(x, y).release().perform()  # 连续元素滑动

        # 获取元素的大小(高和宽),按照屏幕分辨率来滑动
        x = self.driver.get_window_size()['width']
        y = self.driver.get_window_size()['height']
        self.driver.swipe(x * 0.5, y * 0.75, x * 0.5, y * 0.25, 500)  # 上滑
        self.driver.swipe(x * 0.5, y * 0.25, x * 0.5, y * 0.75, 500)  # 下滑
        self.driver.swipe(x * 0.75, y * 0.5, x * 0.25, y * 0.5, 500)  # 左滑
        self.driver.swipe(x * 0.25, y * 0.5, x * 0.75, y * 0.5, 500)  # 右滑

    def test_pinch_zoom(self):
        """捏屏幕和放大屏幕"""
        e1 = self.driver.find_element_by_id(id)
        # 捏 (Pinch)捏屏幕 (双指往内移动来缩小屏幕)
        self.driver.pinch(element=e1)
        # 放大 (Zoom)放大屏幕 (双指往外移动来放大屏幕)
        self.driver.zoom(element=e1)

    def test_screen_shot(self):
        """截屏方法"""
        self.driver.save_screenshot("D:/appium/screenshot/homepage.jpg") # 仅保存图片
        self.driver.get_screenshot_as_file("D:/appium/screenshot/homepage.jpg")  # 完整路径,IOError返回False
        self.driver.get_screenshot_as_base64()  # 截取当前屏幕图片,用于html页面直接嵌入base64编码图片
        self.driver.get_screenshot_as_png()   # 获取当前屏幕截图的二进制文件数据string

    def test_get_message(self):
        """获取当前信息"""
        self.driver.current_url   # 获取当前url
        self.driver.page_source   # 获取页面源
        self.driver.current_package    # 获取当前的包名
        self.driver.current_activity    # 获取当前的activity
        self.driver.current_context    # 列出当前上下文

    def test_pull_file(self):
        """设备推送文件"""
        # 从设备中拉出文件 (Pull File)
        self.driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
        # 推送文件到设备中去
        data = "push test"
        path = "/data/local/tmp/file.txt"
        self.driver.push_file(path, data.encode('base64'))
        # self.driver.push_file(path, data.encode('base64', 'errors'))
        # self.driver.push_file(path, base64.b64encode(bytes("push test", 'utf-8')))

    def test_js(self):
        """JS操作,执行"""
        # 在当前窗口/框架(特指 Html 的 iframe )同步执行 javascript 代码
        driver.execute_script('document.title')
        # 异步执行代码,其他代码在执行
        driver.execute_async_script('document.title')

    def test_system(self):
        """系统杂项功能"""
        self.driver.app_strings(language=None, string_file=None)   # 获取应用字符串
        self.driver.background_app(5)  # 把当前应用置于后台5秒
        self.driver.hide_keyboard()  # 隐藏键盘
        self.driver.keyevent(176)  # 按键事件 (Key Event)给设备发送一个按键事件
        self.driver.toggle_location_services()   # 打开安卓设备上的位置定位设置
        # 打开一个应用或者activity,仅安卓端(百度糯米的包和activity名)
        self.driver.start_activity('com.nuomi', 'com.baidu.bainuo.dex.InstallDexActivity')

    def test_lock_and_open_notifaication(self):
        """锁屏和打开通知栏"""
        self.driver.open_notifications()  # 打开通知栏
        self.driver.find_element_by_id("com.android.systemui:id/clear_all_button").click()  # 点击清除通知
        self.driver.lock(5)  # 锁屏5秒

    def test_remove_install_reset(self):
        """卸载和安装app"""
        self.driver.is_app_installed("com.wochacha")  # 是否安装了app
        self.driver.remove_app("com.wochacha")  # 删除应用
        self.driver.install_app("D:/wochacha.apk")  # 安装应用
        self.driver.reset()  # 重置应用

    def test_launch_close_shake(self):
        """启动和关闭app,摇晃app"""
        # 这三个方法都报错,虽然不常用
        self.driver.launch_app()  # 启动应用
        self.driver.close_app()  # 关闭应用
        self.driver.shake()  # 摇晃设备

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()  # 这句一定要加,不加再次启动appium会无法创建一个新的sessionid
        # cls.driver.close()  # 关闭当前窗口


if __name__ == '__main__':
    # unittest.main(verbosity=2)
    date = time.strftime("%Y%m%d")      # 定义date为日期,time为时间  20180710  年月日
    tm = time.strftime("%Y%m%d-%H%M%S")  # 20180710-124530  年月日-时分秒
    # hms = time.strftime("%H%M%S")     # 124530  时分秒

    # 构造测试集 # 加入测试用例
    suite = unittest.TestSuite()
    suite.addTest(MyTests("test_home_page"))  # 首页
    # suite.addTest(MyTests("test_native_h5"))  # 原生页面与H5的切换
    # suite.addTest(MyTests("test_lock_and_open_notifaication"))  # 锁屏和打开通知栏
    # 执行测试用例 TextTestRunner
    unittest.TextTestRunner().run(suite)   # 执行测试用例
"""
    # 执行测试用例 HtmlTestRunner
    path = "./report/home_page/"+date+"/"
    # 判断是否定义的路径目录存在,不能存在则创建
    if not os.path.exists(path):
        os.makedirs(path)
    else:
        pass
    # report_path = path+time+"report.html"      # 将运行结果保存到report,名字为定义的路径和文件名,运行脚本
    report_path = path + time +"-home_page_1_report.html"   # 不添加时间的测试报告名
    report_title = u"百度糯米首页home_page_1测试报告"
    desc = u'Appium自动化测试报告详情:'

    with open(report_path, 'wb') as report:
        runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
        runner.run(suite)
    # 关闭report,脚本结束
    report.close()
"""
  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值