精华内容
下载资源
问答
  • 主要介绍了Appium Python自动化测试之环境搭建的步骤,以32位的Windows 7操作系统为例介绍Appium+Python的环境搭建步骤,感兴趣的小伙伴们可以参考一下
  • Appium Python 自动化测试二capability Android 参数说明Android 手机如何连接一个Appium server启动服务并连接手机 capability Android 参数说明 1、platformName: 连接设备的平台名称 Android、iOS 2、platform...

    capability Android 参数说明

    1、platformName: 连接设备的平台名称 Android、iOS
    2、platformVersion: 连接设备的 Android 版本
    3、deviceName: 连接设备的名称
    4、appPackage : 被测试包名
    5、automationName: Android版本大于7.0 使用uiAutomator2
    6、autoGrantPermissions : 自动获取权限
    7、unicodeKeyboard: True 支持中文输入
    8、resetKeyboard: 复位键盘
    9、udid: 连接设备的唯一识别号, 获取方式请查看第一篇文章
    10、noReset:
    11、newCommandTimeout:命令超时时间

    Android 手机如何连接一个Appium server

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Time : 2020/9/6 20:52
    # @Author : dorom
    # @File : device_connect.py
    # @Software: PyCharm
    from appium import webdriver
    
    
    class RemoteDriver(object):
    
        def __init__(self,capabilitiesData):
            self.capabilitiesData = capabilitiesData
            platformName = capabilitiesData["platformName"]
            self.Capabilities = {}
            self.Capabilities["platformName"] = platformName
            self.Capabilities["platformVersion"] = capabilitiesData["platformVersion"]
            self.Capabilities["deviceName"] = capabilitiesData["deviceName"]
            if platformName.upper() =="ANDROID":
                self.Capabilities["appPackage"] = capabilitiesData["appPackage"]
                self.Capabilities["appActivity"] = capabilitiesData["appActivity"]
                self.Capabilities["automationName"] = "uiAutomator2"
                self.Capabilities["autoGrantPermissions"] = True # 自动获取需要哪些权限
                self.Capabilities["unicodeKeyboard"] = True # 使用Appium 自带的输入法
                self.Capabilities["resetKeyboard"] = True  # 输入法复位
            else:
                raise Exception("{0} 的手机类型不存在,只支持Android、iOS".format(platformName))
    
            self.Capabilities["udid"] = capabilitiesData["udid"]
            self.Capabilities["noReset"] = True
            self.Capabilities["newCommandTimeout"] = 72000
    
        def remoteDriver(self):
            """
            手机连接Appium server
            :return: Driver
            """
            remoteUrl = "http://{0}:{1}/wd/hub".format(str(self.capabilitiesData["host"]),str(self.capabilitiesData["port"]))
            driver = webdriver.Remote(remoteUrl,self.Capabilities)
            return driver
    

    启动服务并连接手机

    from start_appium_server import AppiumServer
    
    def run(capabilitiesData):
        appium_server = AppiumServer("127.0.0.1", 4723, "udid")
        appium_server.start_appium_server()
        RemoteDriver(capabilitiesData).remoteDriver()
    
    if __name__ == '__main__':
        capabilitiesData = {"platformName":"Android","platformVersion":"7.1",
                            "deviceName":"小米1","appPackage":"com.tencent.mm",
                            "appActivity":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI",
                            "udid":"SJE5T17619002517"}
        run(capabilitiesData)
    
    展开全文
  • Appium Python 自动化测试一前言如何启动一个Appium server启动Appium server 代码 前言 前两天在上班的时候微信突然收到一个陌生的好友申请,我怀着万分好奇的心情统一添加了好友后发现是一个咨询问题的悻悻学子,...

    前言

    • 前两天在上班的时候微信突然收到一个陌生的好友申请,我怀着万分好奇的心情同意添加好友的申请后发现是一个咨询问题的悻悻学子,怀揣着对自动化的向往,让我不禁回想起多年前到处寻找答案的自己
    • 一直都是在各个社区里寻找答案,是时候为社区做一些反馈。 就这样写一篇完整的 Appium 教程的想法就在我心里萌生。
    • 文章内容如果有错误请及时联系

    如何启动一个Appium server

    • 启动一个appium server
      启动命令: appium -a 127.0.0.1 -p 4723 -bp 4724 -U SJE5T17619002517 --session-override -g appium.log
      参数说明:
      1、-a: 指定监听的ip 如: 127.0.0.1
      2、-p: 指定监听的端口 默认4723 也可修改
      3、-b: bootstartport 指定appium和测试设备的通信端口
      4、-U: 手机设备 Android使用: adb devices 查看 iOS bundleID 使用: idevice_id -l
      5、-g 指定appium log的日志路径
      6、--session-override 允许会话覆盖(如有冲突)

    启动Appium server 代码

    • 在学习阶段我们会手动在 terminal 上输入appium server 启动命令,但在实际工作中这种方法是不可取的,所以我们需要使用代码封装启动命令,如果你学习时使用了appium desktop 启动了Appium server 则就不需要使用以下代码
    • 判断Appium server 是否启动成功使用http://host:port/wd/hub/status
    • 以下代码启动Appium server 兼容了windows和mac
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Time : 2020/9/6 20:26
    # @Author : dorom
    # @File : start_appium_server.py
    # @Software: PyCharm
    
    import subprocess
    import os
    import time
    import requests
    import sys
    import re
    
    
    class AppiumServer(object):
        def __init__(self, host, port, udid, webDriver=None):
            self.host = host
            self.port = port
            self.udid = udid
            self.webDriver = webDriver
    
        def start_appium_server(self):
            """
            启动Appium Server
            :param host: 启动的本地ip
            :param port: 启动端口
            :param udid: 绑定的udid
            """
            bootStarpPort = str(self.port + 1)
            appium_log = os.path.join('.', str(self.port) + '.log')
            if os.path.exists(appium_log):
                os.remove(appium_log)
    
            cmd = " appium -a {0} -p {1} -bp {2} -U {3} --session-override -g {4}".format(
                self.host, self.port, bootStarpPort, self.udid, appium_log)
            if self.checkPort():
                self.stopPort()
    
            p = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT)
            flage = False
            checkCount = 0
            while not flage and checkCount < 7:
                time.sleep(1)
                flage = self.checkPort()
                if flage:
                    print("端口:{0} Appium 系统服务启动成功".format(self.port))
                if not flage and checkCount == 6:
                    print("端口:{0} Appium 系统服务启动成功".format(self.port))
                checkCount += 1
    
        def checkPort(self):
            """
            端口检查
            :return: check res
            """
            try:
                requests.get("http://{0}:{1}/wd/hub/status".format(self.host, self.port))
                res = True
            except:
                res = False
            return res
    
        def stopPort(self):
            """
            关闭appium server
            :param port:
            :return:
            """
    
            platform = sys.platform
            if "win" in platform:
                cmd = 'netstat -ano|findstr "{0}"'.format(self.port)
            else:
                cmd = "ps -ef | grep {0}".format(self.port) + "| awk '{print $2}'"
            pid_list = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
            pattrn = re.compile(r"(\d+)")
            for pid in pid_list:
                if "win" in platform:
                    cmd = "taskkill /pid   {0} /f".format(pattrn.findall(str(pid))[-1])
                    print(cmd)
                else:
                    cmd = 'kill -9 {0}'.format(pattrn.findall(str(pid))[0])
                os.system(cmd)
            print("端口:{0}退出成功".format(self.port))
    
    
    if __name__ == '__main__':
        appium_server = AppiumServer("127.0.0.1", 4723, "udid")
        appium_server.start_appium_server()
    
    展开全文
  • 测试报告在任何测试自动化框架中都是至关重要的,而且我们都知道,即使专家也需要付出多大的努力才能生成测试自动化报告,更不用说我们是否也想拥有自定义自由……在此,有许多定制的解决方案可供选择。行业来帮助...

    正如您在全新的TestProject Python SDK(第1部分第2部分)上的先前文章中可能已经读到的那样,该SDK将生成美观的HTML测试报告,并自动为您将它们发布到TestProject平台上,无需其他配置(您也可以将其下载为PDF文件)。但是您知道报告也是高度可配置的吗?

    测试报告在任何测试自动化框架中都是至关重要的,而且我们都知道,即使专家也需要付出多大的努力才能生成测试自动化报告,更不用说我们是否也想拥有自定义自由……在此,有许多定制的解决方案可供选择。行业来帮助我们克服这一问题,例如:JUnit,Jenkins插件,ELK,Grafana,甚至开发定制的Web仪表板。

    但是,没有现成的测试报告解决方案。输入TestProject,它为用户提供了一个完整的专用报告环境,该环境免费支持Selenium,Appium和Python。TestProject自动为您创建HTML和PDF报告(开箱即用,无需其他配置)。

    您所需要做的就是注册一个免费的TestProject帐户,下载并安装TestProject代理(该代理已经包含了您的所有Selenium / Appium驱动程序),使用pip(pip install testproject-python-sdk)安装TestProject Python SDK 并配置您的开发人员令牌。

    使用TestProject,您可以免费访问可完全自定义的广泛报告功能(如下文所述),包括:云中的详细分析仪表板,屏幕截图,通过/失败条件,自定义错误消息,下载报告的能力转换为PDF,可以轻松地与队友共享报告,RESTful API访问权限以及100%的Selenium和Appium兼容性(不仅与Python兼容,而且与Java和C#共享!)。

    打开即用的HTML测试报告

    如果您保留所有设置不变,则SDK将:

    • 生成带有自动推断的项目,作业和测试名称的报告

       

    • 在驱动程序上调用命令或执行的测试方法的名称更改时,自动报告新测

      试。quit()

    • 包含所有已执行的WebDriver命令及其结果(通过或失败)

    • 在敏感(密码)文本字段元素中键入的修订值。

    所有这些选项都是可配置的,因为您很快就会看到。

    指定自定义项目和职位名称

    如果要覆盖TestProject报表中显示的自动推断的项目和作业名称,可以采用两种方法。第一种方法是将自定义项目和作业名称作为参数传递给驱动程序构造函数:

    from src.testproject.sdk.drivers import webdriverdef test_custom_project_and_job_names():    driver = webdriver.Chrome(projectname="My project", jobname="Reporting job")    driver.get("https://example.testproject.io/web/")

     

    第二种方法是在@report 装饰器中指定它们:

    from src.testproject.decorator import reportfrom src.testproject.sdk.drivers import webdriver@report(project="My project", job="Reporting job")def test_project_and_job_names_in_decorator():    driver = webdriver.Chrome()    driver.get("https://example.testproject.io/web/")
    

    这两个选项都将导致指定的项目和作业名称显示在TestProject中:

     

    指定自定义测试名称

    如果您想要在报告中使用自定义测试名称(即,不是测试方法的名称),则也可以使用@report装饰器:

    from src.testproject.decorator import reportfrom src.testproject.sdk.drivers import webdriver@report(test="我的自定义测试名称")def test_name_in_decorator():    driver = webdriver.Chrome()    driver.get("https://example.testproject.io/web/")

     

    当这样指定时,将使用自定义测试名称,而不是自动推断的名称:

    手动测试和步骤报告

    默认情况下,当在驱动程序上调用quit()命令或执行的测试方法的名称发生更改时,SDK会自动报告新的测试。可以禁用此行为:

    from src.testproject.sdk.drivers import webdriverdef test_disable_automatic_test_reporting():    driver = webdriver.Chrome()    driver.report().disable_auto_test_reports(disabled=True)    driver.get("https://example.testproject.io/web/")

     

    您可以改为手动报告测试,如下所示:

    from src.testproject.sdk.drivers import webdriverdef test_report_a_test_manually():    driver = webdriver.Chrome()    driver.report().disable_auto_test_reports(disabled=True)    driver.get("https://example.testproject.io/web/")    driver.report().test(name="手工报告的测试", passed=True)

    这将导致在TestProject平台上报告以下测试:

    此外,您还可以手动报告中间步骤,甚至在执行操作时添加屏幕截图:

    from src.testproject.sdk.drivers import webdriverdef test_report_a_step_manually():    driver = webdriver.Chrome()    driver.report().disable_auto_test_reports(disabled=True)    driver.get("https://example.testproject.io/web/")    driver.report().step(description="中间测试步骤", message="另一条消息", passed=False, screenshot=True)    driver.report().test(name="手工报告的测试", passed=True)

    这将导致此步骤包含在测试报告中:

    如您所见,该步骤包括一个屏幕截图(单击时将放大)。还要注意,即使我们将手动报告的测试设置为通过了我们的代码,由于该测试步骤中失败的步骤,它仍被标记为失败。

    禁用编辑进入安全文本字段的文本

    默认情况下,SDK会编辑被键入到包含敏感数据的文本字段中的文本,即:

    • type具有值(所有浏览器和操作系统类型)的属性的字段password

    • 类型的字段XCUIElementTypeSecureTextField(仅在具有XCUITest的iOS上)。

    在此文本字段中键入的文本在报告中被星号替换:

    如果您愿意,可以将其禁用:

    def test_disable_command_redaction():    driver = webdriver.Chrome()    driver.report().disable_auto_test_reports(disabled=True)    driver.get("https://example.testproject.io/web/")    driver.report().disable_redaction(disabled=True)    driver.find_element_by_css_selector("#name").send_keys("Software test")    driver.find_element_by_css_selector("#password").send_keys("12345")

    导致以纯文本形式报告密码值,而不是:

    禁用报告

    最后,您还可以在不同程度上禁用各种报告。

    如果您不想自动报告WebDriver命令,则可以指定如下:

    def test_disable_driver_command_reporting():    driver = webdriver.Chrome()    driver.report().disable_command_reports(disabled=True)    driver.get("https://example.testproject.io/web/")  # 不会报告此命令    driver.report().disable_command_reports(disabled=False)    driver.find_element_by_css_selector("#name").send_keys("Software test")  # 将报告此命令

    如果要暂时禁用所有报告,也可以执行以下操作:

    def test_disable_all_reporting_temporarily():    driver = webdriver.Chrome()    driver.report().disable_reports(disabled=True)    # 这里不会有任何报道    driver.report().disable_reports(disabled=False)

    如果要永久禁用特定驱动程序会话的报告,也可以执行以下操作:

    ​​​​​​​

    def test_project_and_job_names_in_decorator():    driver = webdriver.Chrome(disable_reports=True)

    请注意,在最后一种情况下,您无法在驱动程序会话期间重新启用报告!

     

     

    推荐阅读

     


    展开全文
  • 因为成本、质量的变化现在对自动化测试的重视度越来越高,在几年前自动化测试还没有像现在这么普及,但是现在随便去一家公司面试都会问到自动化测试,当然这个和他们公司是否运用到另说。但是不言而喻的是大家都意识...

    1.1 移动自动化测试现状

    因为软件行业越来越发达,用户的接受度也在不断提高,所以对软件质量的要求也随之提高,当然这个也要分行业,但这个还是包含了大部分。因为成本、质量的变化现在对自动化测试的重视度越来越高,在几年前自动化测试还没有像现在这么普及,但是现在随便去一家公司面试都会问到自动化测试,当然这个和他们公司是否运用到另说。但是不言而喻的是大家都意识到了软件测试这个行业都走向了自动化这条路。或许你认为实施自动化可能不是必须的,可能在你的观念中测试思想是最重要的,所谓的自动化工具或者框架都是用来辅助的,但是作者想告诉你的是:计算机行业的发展、软件测试行业的发展其实就像工业革命一样,为的是通过此途径解决人类手工劳动的复杂性,当然可能并不一定是这几年出现,但是如果我们不学习肯定会被时代淘汰。对于现在的我们来说自动化测试是我们必须掌握的技能,同时它也是这个行业的一种发展趋势,当然你想要提高到更高的一个档次可以往测试开发走,我坚信你能够走得更远。

    1.2 本课程目标

    因为作者也是从一个初学者过来的,而且在初学的过程中走了许多的弯路,所以作者希望通过本书带领读者从一个初级用户到高级用户,从不会到自己能够独挡一面。

    我们共同的目的是先掌握android的基础知识、appium相关环境知识、python的基础知识、常见api的使用以及封装、日志的收集、报告的生成、再是我们常用的数据驱动、页面驱动,还有后面的nose框架的介绍以及使用。 

    整个书的目标是希望读者真的能够只是通过本书的知识就能够完全掌握appium相关的自动化知识,成为大家跳槽涨薪的必备技能。光说不练也不行,所以作者希望大家看本书时跟着一起敲代码,熟能生巧。

    1.3 自动化测试流程

    无论在做什么事情之前都需要掌握其流程,自动化也是一样,我们首先要掌握的就是流程,如果你连最起码的流程都无法掌握,那么你也没办法做好自动化。作者将通过自己的项目经验来写,当然这个不一定就是标准的答案,所以如果有觉得不符合的也不要吐槽,可以提出来一起讨论。

    我们通过下面的图片来了解

    可能有的人会有疑问说:这个怎么看就是一个v模型呢?这个作者只是为了让大家更容易理解这样编写的。可能还有人会说我们做自动化为什么不是直接拿着需求就开始写代码,浪费那么多时间去做其他的有什么好处呢?我们来一 一讲解。

    1、需求了解:当给你一个需求或者一个系统让你去做自动化的时候你什么都不知道你就去做自动化能行吗?你不去分析需求或者系统的哪些模块儿适合做自动化你怎么去做?如果盲目的去做,当你做到后面的时候可能你框架还没弄好需求或者系统又变了,那你是否做了无用功?所以我们第一步一定是确定需求或者系统哪些模块适合做自动化,而且一定要明白这个需求或者系统做自动化给我们带来的好处是什么,而不是说做自动化就是为了表示我们会做。

    2、需求分析:和需求了解有类似之处,我们在这个期间主要做的就是分析需求或者系统哪些模块适合做自动化,做自动化给我们的好处是什么,为后期方案提供参考,提供可用信息。

    3、方案选择:有的人可能对选择方案会比较陌生,不知道这个到底是干什么的?那么问你一个很简单的问题,现在自动化测试框架常见的有robotium、appium、monkeyrunnner、UIAutomator等等,这么多的框架你为什么选择学习appium呢?其实这就是一个方案的选择,那么有时候你也会根据你项目的需求去选择一个更加适合的框架,让我们这个需求实现利益最大化。

    4、环境准备:这个最好理解,方案选择好之后就该准备环境了。这个环境不会像大家想的那样配置一个jdk、appium、ide就行了,你需要考虑的是appium的版本、持续集成、代码管理等等问题,这个详细内容在后面框架部分作者会讲到。

    5、系统设计:刚开始接触自动化的小伙伴可能对这个比较陌生,不知道什么叫做系统设计,不用担心。在做自动化的时候大家是否考虑过一个问题:在自动化过程中我们公用的东西是怎么提取出来的,为什么要按照不同的包结构来进行框架搭建,为什么不能够是所有的都在一个包下或者一个类下面?我们简单的看一下下面这个图片

     

    从图片中我们能够看出在这个工程中我们有专门存放app的地方,有单独的配置文件、case、以及读取配置文件的地方,共同的特点就是他们都没有在一起,这还只是一个简单的例子,在以后我们的工作中这个是最常见的,在开发之前我们就需要把这些规划好,因为一个项目往往是一个团队来做,那么大家肯定是先划分模块,分工,在后期还会涉及到一些模块间的调用。目的就是让我们一目了然的就知道这个包是做什么的,把公用的都提取了,各司其能。

    6、编码:编码故名思意就是编写代码,只是这里我们的编写代码是根据事先写好的用例来进行编写代码。

    笔者在这里说一个题外话,这个也是很多初学者会面临的一个问题,这也是为什么很多人看了一些自动化的资料但是一直无法做自动化的原因。在很多的公司自动化会分两个组,一个是开发测试框架,一个是写测试用例,这里的测试用例是自动化的case,不要理解错。

    7、执行:执行是整个自动化展示成果的重要一部,最后的结果我们看到的是执行了多少case,通过多少,通过率是多少,失败的为什么失败。这也是领导或者其他相关人员想看到的数据。

    那么为了这一步我们的自动化要做多少准备呢?作者会在本书中一 一给大家讲解。

    1.4 自动化测试用例的编写

    自动化测试用例和我们常用的功能测试用例虽说区别不是很大,但还是有一定的区别,下面我们用登陆功能来举例:

    功能冒烟用例:

    (备注:因为格式原因所以表格里面没办法调整,用例中步骤1=>1,以此类推)

     

    上面图片就是一个简单登陆冒烟测试,自动化的用例不同之处在于更仔细。来我们直接通过下面的用例来给大家讲解:

    自动化登陆用例:

    通过上面的用例我们不难看出自动化和功能测试用例最大的区别在于自动化要求更详细,信息更加准确,当然这个并不是完全标准的,这个只是作者在工作中和接触的人中大家基本都用的类似用例。很多公司设计用例的和将用例转换为自动化脚本的并不一定是同一个人,所以我们需要保证的是别人看见你的自动化测试用例能够准确的编写出测试脚本,这也是我们的目的。

    文章为转载,感谢各位前辈的整理和努力


    展开全文
  • 无论是在手动测试还是自动化测试中场景复现永远是一个很重要的事情,有时候一些问题可能很难复现,这个都需要测试人员对bug有很高的敏感度,在一般的情况下有一个很好的测试习惯也很重要,发现bug马上截图,不要管...
  • 2.1 基础环境搭建当我们学习新的一项技术开始基本都是从环境搭建开始,本书除了第一章节也是的,如果你连最基础的环境都没有那么我们也没必要去说太多,大概介绍一下:1、因为appium是支持android和ios自动化的,...
  • 文章为转载,感谢各位前辈的整理和努力4.1界面认识在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西。首先看第一...
  • 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行。所以本章节的知识我希望大家多动手去操作,不要仅仅只是书本上的知识,毕竟这个我只能够举例说明。下面我们来...
  • 自动化测试过程中如果你只知道常用的一些参数配置,这个是远远达不到要求,因为你不知道什么时候有什么样的突发情况发生,所以你需要了解appium所有最常用的配置参数,当然你可以掌握所有,那样更好,熟能生巧。...
  • 文章为转载,感谢各位前辈的整理和努力   13.1 测试报告概述 13.1.1 测试报告的定义 ...在手工测试过程中如果发现了bug我们需要提交测试报告,自动化中虽然当程序出错的时候我们不可能让程序自动...
  • 其实日志无论是在测试、开发中都非常重要,如果你在跑自动化时程序报错了,但是你没有日志你怎么去定位时程序错误还是你app的错误?或者还是其它环境因素? 在java中有log4j这日志模块,在python里...
  •  在前面的的章节内嵌h5页面定位我们就已经讲过这个问题,其实本讲的内容大家可以仔细把定位的内嵌h5定位问题再回顾一遍那么你就能够理解这里面的东西,这里会有一个问题是,在我们的app自动化中和web自动化中会有...
  • 在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道我们需要对哪个app做自动化,现在能理解Package是什么意思了么? 什么是Activity呢?官方给出的解释Activity是Android组建中最基本...

空空如也

空空如也

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

appiumpython自动化测试

python 订阅