精华内容
下载资源
问答
  • 主要介绍了Appium Python自动化测试之环境搭建的步骤,以32位的Windows 7操作系统为例介绍Appium+Python的环境搭建步骤,感兴趣的小伙伴们可以参考一下
  • Appium python 自动化

    2017-08-31 10:56:49
    - sdk要配置环境变量:D:\Android\adt-bundle-windows-x86-20130917\sdk\platform-tools;D:\Android\adt-bundle-windows-x86-20130917\sdk\tools 把“platform-...- appium的使用:需要配置java环境变量,打开虚拟机

    - sdk要配置环境变量:D:\Android\adt-bundle-windows-x86-20130917\sdk\platform-tools;D:\Android\adt-bundle-windows-x86-20130917\sdk\tools 把“platform-tools”和“tools ”分别配到Path里面。

    - appium的使用:需要配置java环境变量,打开虚拟机(建议使用真实的安卓手机,虚拟机不完善),sdk(不要放在中文目录下)代码如下:

    #coding:utf-8
    from appium import webdriver

    desired_caps = {} //这段字典里的键建议复制,否则可能会报错
    desired_caps[‘platformName’] = ‘Android’
    desired_caps[‘platformVersion’] = ‘4.4.2’
    desired_caps[‘deviceName’] = ‘Android Emulator’
    desired_caps[‘appPackage’] = ‘com.estrongs.android.pop’
    desired_caps[‘appActivity’] = ‘.view.FileExplorerActivity’

    driver = webdriver.Remote(‘http://localhost:4723/wd/hub‘, desired_caps) #这里/wd/hub是固定写法

    展开全文
  • 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)

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

     

     

    推荐阅读

     


    展开全文
  • 无论是在手动测试还是自动化测试中场景复现永远是一个很重要的事情,有时候一些问题可能很难复现,这个都需要测试人员对bug有很高的敏感度,在一般的情况下有一个很好的测试习惯也很重要,发现bug马上截图,不要管...
  • 2.1 基础环境搭建当我们学习新的一项技术开始基本都是从环境搭建开始,本书除了第一章节也是的,如果你连最基础的环境都没有那么我们也没必要去说太多,大概介绍一下:1、因为appium是支持android和ios自动化的,...
  • 文章为转载,感谢各位前辈的整理和努力4.1界面认识在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西。首先看第一...
  • 因为成本、质量的变化现在对自动化测试的重视度越来越高,在几年前自动化测试还没有像现在这么普及,但是现在随便去一家公司面试都会问到自动化测试,当然这个和他们公司是否运用到另说。但是不言而喻的是大家都意识...
  • 自动化直接提取android的信息,不用在命令行中自己手动提取。如下: # 正则表达式匹配出 id 信息 deviceId = re.findall(r'^\w*\b', readDeviceId[1])[0] # 读取设备系统版本号 deviceAndroidVersion = list(os....
  • 文章为转载,感谢各位前辈的整理和努力   6.1 常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你...无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看到...
  • 我们在appium中配置app后我们能够通过log看出里面的信息都是启动的一些必要配置,通过上面的配置信息我么也能够看出capability配置的就是我们做自动化的一些必要信息。他主要是告诉server我们本次测试是浏览器还是...
  • 其实日志无论是在测试、开发中都非常重要,如果你在跑自动化时程序报错了,但是你没有日志你怎么去定位时程序错误还是你app的错误?或者还是其它环境因素? 在java中有log4j这日志模块,在python里...
  •  在前面的的章节内嵌h5页面定位我们就已经讲过这个问题,其实本讲的内容大家可以仔细把定位的内嵌h5定位问题再回顾一遍那么你就能够理解这里面的东西,这里会有一个问题是,在我们的app自动化中和web自动化中会有...
  • 可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果之前写了一些脚本,发现有的时候一些元素不能够很好的定位时,那么就需要采用android ...

空空如也

空空如也

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

appiumpython自动化

python 订阅