精华内容
下载资源
问答
  • python脚本编写

    万次阅读 多人点赞 2019-03-29 22:37:20
    什么是脚本 Python 是一种“脚本语言”。脚本,对应的英文是:script。一般人看到script这个英文单词,或许想到的更多的是:电影的剧本,就是一段段的脚本,所组成的。电影剧本的脚本,决定了电影中的人和物,都做...

     

    什么是脚本

    Python 是一种“脚本语言”。脚本,对应的英文是:script。一般人看到script这个英文单词,或许想到的更多的是:电影的剧本,就是一段段的脚本,所组成的。电影剧本的脚本,决定了电影中的人和物,都做哪些事情,怎么做。而计算机中的脚本,决定了:计算机中的操作系统和各种软件工具,要做哪些事情,以及具体怎么做。

    脚本 vs 程序

    你可能想要了解脚本与一般程序的区别是什么。

    脚本与一般程序的主要区别在于是否编译。相对于程序而言,脚本更加随性。写完了脚本,直接就可以在某种具有解释功能的环境中运行。(我们将会在本课学习如何写和运行 Python 脚本。)

    而非脚本语言(编译语言),比如 C、Java 语言。我们需要通过编译(Compile)和链接(link)等步骤,生成可执行文件。然后通过可执行文件在计算机上运行。

    脚本编写

    欢迎学习这节关于脚本编写的课程!你将学习:

    • Python 安装和环境设置
    • 运行和修改 Python 脚本
    • 与用户输入交互
    • 处理异常
    • 读写文件
    • 导入本地、标准和第三方模块
    • 在解释器中进行实验

    安装 Python 3

    我们将使用最新版 Python - Python 3。虽然 Python 2 在很多场合依然会用到,但是已经不再接受更新。为了与后续 Python 改进保持兼容,建议使用 Python 3。

    为了完成这一步骤,你需要使用命令行。我们将详细介绍所有细节部分,因此如果你从未使用过命令行,也没关系!如果你想深入了解命令行,请参阅我们的 Shell 讲习班,详细了解 Unix Shell。

    你的计算机上已经有 Python 吗?

    Mac OS X 和 Linux 通常已经自带了一个版本号比较老的 Python 2,请不要对该 Python 做出任何修改或者删除,因为操作系统的部分组件依赖它,修改或者删除它可能会影响到操作系统的某些功能。但是单独安装 Python 3,也不会对系统有任何影响。

    Windows 通常没有自带 Python,但是你可以在安装之前,先检查下系统是否安装了 Python。首先检查是否已经安装了 Python 3。

    打开终端或命令行。在 Windows 上,进入命令提示符窗口的方式是转到运行…(同时按下带有windows图标的win键+字母r),然后输入 cmd 并按下 Enter 键。

    在新的终端或命令提示符窗口中,输入 python --version 或者 python3 --version

    $ python --version
    

    然后按下 Enter 键。

    注意:这里的$符号在这里只是一个提示,表示命令行的开始,它会自动显示在屏幕上。这不是命令的一部分。

    系统可能会显示已安装的 Python 版本是 Python 2.7.9。在这种情况下,表明你已经安装了 Python 2,你需要按照下面几个部分中的步骤操作,更新到 Python 3。

    如果版本号以 3 开头,则表明你已经安装了 Python 3!请勿再次安装 Python!

    此外,你可能会看到错误消息。暂时不用管该错误,直接尝试下面几个部分中的步骤。

    方法 1:安装 Anaconda

    对于数据分析学员,强烈建议采用这种 Python 安装方式。

    如果你对数据科学方面的 Python 感兴趣,强烈建议安装 Anaconda,即使你已经在计算机上安装了 Python。如果你尚未设置计算机,请参阅我们的 Anaconda 和 Jupyter notebook 简短课程设置计算机。你将学习如何为这门课程设置环境,需要安装 Python 3.6、Jupyter Notebook、NumPy、pandas、Matplotlib 和 Seaborn。

    Anaconda 包含大量专门针对数据科学的库和软件分发版本,某些库和软件比较难安装。同时,你可以很轻松地在计算机上设置不同的环境,以便在不同版本的 Python 和软件包之间快速切换!例如,如果你正在处理的某个项目需要 Python 3.6 以及不同的依赖项,那么 Anaconda 的环境管理功能可以提供帮助。上面给出链接的 Anaconda 和 Jupyter notebook 免费课程讲授了如何处理这类情形。

    如果你的英语不是很熟练,你也可以在中文网站上搜索安装Anaconda的教程,比如这个知乎帖子

    方法 2:安装 Python

    对使用 Python 进行数据分析不感兴趣的学员建议采用此方法。

    如果你对学习面向数据科学的 Python 不感兴趣,并且你的计算机尚未安装 Python 3,那么现在该安装 Python 3 了!请转到 Python 下载页面并找到适用于你的操作系统、以 3 开头的最新版本(例如 Python 3.5.2)。

    对于 Windows 和 Mac,我们发现最简单的方法是直接从 Python 下载网站下载安装程序并运行。如果你使用的是 Linux,Python 下载页面提供了进行下载和编译的源代码。此外,你可以使用 APT 等安装工具安装 Python 3。

    如果你使用的是 Windows 设备,确保在安装过程中选中 Add Python 3.5 to PATH 或 Add Python to environment variables 选项,这样可以确保从命令行提示符窗口中访问 Python。

    如果你使用的是 Windows 设备,并且已经安装了 Python,但是未选中上述选项,则需要将 Python 添加到 PATH。这样的话,当你输入 python 时,可以告诉命令行运行 Python 3。如果你未选中上述选项,或者转到下一阶段时似乎不可行,请按照 Python 文档中的这些说明将 Python 添加到 PATH。

    完成安装程序中的所有步骤操作或编译了源代码后,则安装完毕,你可以在自己的计算机上使用 Python 3 了!

    运行 Python 脚本

    运行 Python 脚本!!

    1. 下载在本页面底部给出链接的文件 first_script.py(你可能需要右击它,并存储为文件),然后将该文件移到计算机上的相应目录下。如果你还没有为这门课程创建一个目录的话,可以乘机创建一个目录。
    2. 打开终端并使用 cd 命令转到包含所下载文件的目录。
    3. 现在你已经位于该文件所在的目录,可以运行该文件了,方法是输入 python first_script.py,然后按下 Enter 键。

    提示:文件下载后,_ 会变成- ,你可能需要改成python first-script.py

    如果你看到终端输出了以下消息,则表明你成功地运行了脚本:

    Congratulations on running this script!!
    

    辅助材料

     first_script.py

    编程环境设置

    配置 Python 编程环境

    你已经看到我的设置,现在花时间在你自己的计算机上熟悉下界面。 下面是一些我们推荐的文本编辑器,你可以尝试一个看看。

    对于 Mac:

    对于 Windows:

    对于 Linux:

    设置好屏幕,打开文本编辑器、终端/命令行,并在网络浏览器中打开优达学城课堂,以便与你的 Python 脚本交互。调整显示器选项,找到你觉得最舒适的显示效果,并看看能否找到 tab-to-four-spaces 选项 - 该选项对于 Python 缩进来说非常有用。

    修改 Python 脚本

    自己编写脚本

    在文本编辑器中打开全新的空文件,命名该文件并将其保存到放置 Python 课程文件的文件夹中。将以下代码放入该文件里。

    how_many_snakes = 1
    snake_string = """
    Welcome to Python3!
    
                 ____
                / . .\\
                \  ---<
                 \  /
       __________/ /
    -=:___________/
    
    <3, Juno
    """
    
    
    print(snake_string * how_many_snakes)

    在脚本中接受原始输入

    我们可以使用内置函数 input 获取用户的原始输入,该函数接受一个可选字符串参数,用于指定在要求用户输入时向用户显示的消息。

    name = input("Enter your name: ")
    print("Hello there, {}!".format(name.title()))
    

    这段代码提示用户输入姓名,然后在问候语中使用该输入。input 函数获取用户输入的任何内容并将其存储为字符串。如果你想将输入解析为字符串之外的其他类型,例如整数(如以下示例所示),需要用新的类型封装结果并从字符串转换为该类型。

    num = int(input("Enter an integer"))
    print("hello" * num)
    

    我们还可以使用内置函数 eval 将用户输入解析为 Python 表达式。该函数会将字符串评估为一行 Python 代码。

    result = eval(input("Enter an expression: "))
    print(result)
    

    如果用户输入 2 * 3,输出为 6

    练习:在脚本中接受原始输入

    练习:生成消息

    假设你是一名老师,需要向每位学生发一条消息,提醒他们未交的作业和分数是多少。你知道每名学生的姓名,没交的作业份数和分数,这些数据保存在了电子表格中,你只需将这些输入插入你想到的以下消息中即可:

    Hi [insert student name],

    This is a reminder that you have [insert number of missing assignments] assignments left to submit before you can graduate. Your current grade is [insert current grade] and can increase to [insert potential grade] if you submit all assignments before the due date.

    你可以将此消息复制粘贴后发送给每位学生,并且每次手动插入相应的值。但是你要写一个程序来帮助你完成这一流程。

    写一个完成以下操作的脚本:

    1. 请求用户输入三次。一次是名字列表,一次是未交作业数量列表,一次是分数列表。使用该输入创建 namesassignments 和 grades 列表。
    2. 使用循环为每个学生输出一条信息并包含正确的值。潜在分数是 2 乘以未交作业数加上当前分数。

    下面是在终端内成功运行该脚本的示例。

    错误和异常

    • 当 Python 无法解析代码时,就会发生语法错误,因为我们没有遵守正确的 Python 语法。当你出现拼写错误或第一次开始学习 Python 时,可能会遇到这些错误。

    • 当在程序执行期间出现意外情况时,就会发生异常,即使代码在语法上正确无误。Python 有不同类型的内置异常,你可以在错误消息中查看系统抛出了什么异常。

    Try 语句

    我们可以使用 try 语句处理异常。你可以使用 4 个子句(除了视频中显示的子句之外还有一个子句)。

    • try:这是 try 语句中的唯一必需子句。该块中的代码是 Python 在 try 语句中首先运行的代码。
    • except:如果 Python 在运行 try 块时遇到异常,它将跳到处理该异常的 except 块。
    • else:如果 Python 在运行 try 块时没有遇到异常,它将在运行 try 块后运行该块中的代码。
    • finally:在 Python 离开此 try 语句之前,在任何情形下它都将运行此 finally 块中的代码,即使要结束程序,例如:如果 Python 在运行 except 或 else 块中的代码时遇到错误,在停止程序之前,依然会执行此finally 块。

    为何在 Python 中需要 finally 子句?

    指定异常

    我们实际上可以指定要在 except 块中处理哪个错误,如下所示:

    try:
        # some code
    except ValueError:
        # some code
    

    现在它会捕获 ValueError 异常,但是不会捕获其他异常。如果我们希望该处理程序处理多种异常,我们可以在 except 后面添加异常元组。

    try:
        # some code
    except (ValueError, KeyboardInterrupt):
        # some code
    

    或者,如果我们希望根据异常执行不同的代码块,可以添加多个 except 块。

    try:
        # some code
    except ValueError:
        # some code
    except KeyboardInterrupt:
        # some code

    练习解决方案:处理除以零的情形

    def create_groups(items, num_groups):
        try:
            size = len(items) // num_groups
        except ZeroDivisionError:
            print("WARNING: Returning empty list. Please use a nonzero number.")
            return []
        else:
            groups = []
            for i in range(0, len(items), size):
                groups.append(items[i:i + size])
            return groups
        finally:
            print("{} groups returned.".format(num_groups))
    
    print("Creating 6 groups...")
    for group in create_groups(range(32), 6):
        print(list(group))
    
    print("\nCreating 0 groups...")
    for group in create_groups(range(32), 0):
        print(list(group))

    修改上面的脚本以处理除以零错误。正确修改的话,应该会输出:

    Creating 6 groups...
    6 groups returned.
    [0, 1, 2, 3, 4]
    [5, 6, 7, 8, 9]
    [10, 11, 12, 13, 14]
    [15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    [25, 26, 27, 28, 29]
    [30, 31]
    
    Creating 0 groups...
    WARNING: Returning empty list. Please use a nonzero number.
    0 groups returned.

    访问错误消息

    在处理异常时,依然可以如下所示地访问其错误消息:

    try:
        # some code
    except ZeroDivisionError as e:
       # some code
       print("ZeroDivisionError occurred: {}".format(e))
    

    应该会输出如下所示的结果:

    ZeroDivisionError occurred: division by zero
    

    因此依然可以访问错误消息,即使已经处理异常以防止程序崩溃!

    如果没有要处理的具体错误,依然可以如下所示地访问消息:

    try:
        # some code
    except Exception as e:
       # some code
       print("Exception occurred: {}".format(e))
    

    Exception 是所有内置异常的基础类。你可以在此处详细了解 Python 的异常。

    读写文件

    以下是如何在 Python 中读写文件的方式。

    读取文件

    f = open('my_path/my_file.txt', 'r')
    file_data = f.read()
    f.close()
    
    1. 首先使用内置函数 open 打开文件。需要文件路径字符串。open 函数会返回文件对象,它是一个 Python 对象,Python 通过该对象与文件本身交互。在此示例中,我们将此对象赋值给变量 f
    2. 你可以在 open 函数中指定可选参数。参数之一是打开文件时采用的模式。在此示例中,我们使用 r,即只读模式。这实际上是模式参数的默认值。
    3. 使用 read 访问文件对象的内容。该 read 方法会接受文件中包含的文本并放入字符串中。在此示例中,我们将该方法返回的字符串赋值给变量 file_data
    4. 当我们处理完文件后,使用 close 方法释放该文件占用的系统资源。

    写入文件

    f = open('my_path/my_file.txt', 'w')
    f.write("Hello there!")
    f.close()
    1. 以写入 ('w') 模式打开文件。如果文件不存在,Python 将为你创建一个文件。如果以写入模式打开现有文件,该文件中之前包含的所有内容将被删除。如果你打算向现有文件添加内容,但是不删除其中的内容,可以使用附加 ('a') 模式,而不是写入模式。
    2. 使用 write 方法向文件中添加文本。
    3. 操作完毕后,关闭文件。

    With

    Python 提供了一个特殊的语法,该语法会在你使用完文件后自动关闭该文件。

    with open('my_path/my_file.txt', 'r') as f:
        file_data = f.read()
    

    该 with 关键字使你能够打开文件,对文件执行操作,并在缩进代码(在此示例中是读取文件)执行之后自动关闭文件。现在,我们不需要调用 f.close() 了!你只能在此缩进块中访问文件对象 f。

    导入本地脚本

    我们实际上可以导入其他脚本中的 Python,如果你处理的是大型项目,需要将代码整理成多个文件并重复利用这些文件中的代码,则导入脚本很有用。如果你要导入的 Python 脚本与当前脚本位于同一个目录下,只需输入 import,然后是文件名,无需扩展名 .py。

    import useful_functions
    

    Import 语句写在 Python 脚本的顶部,每个导入语句各占一行。该 import 语句会创建一个模块对象,叫做 useful_functions。模块是包含定义和语句的 Python 文件。要访问导入模块中的对象,需要使用点记法。

    import useful_functions
    useful_functions.add_five([1, 2, 3, 4])
    

    我们可以为导入模块添加别名,以使用不同的名称引用它。

    import useful_functions as uf
    uf.add_five([1, 2, 3, 4])
    

    使用 if main 块

    为了避免运行从其他脚本中作为模块导入的脚本中的可执行语句,将这些行包含在 if __name__ == "__main__" 块中。或者,将它们包含在函数 main() 中并在 if main 块中调用该函数。

    每当我们运行此类脚本时,Python 实际上会为所有模块设置一个特殊的内置变量 __name__。当我们运行脚本时,Python 会将此模块识别为主程序,并将此模块的 __name__ 变量设为字符串 "__main__"。对于该脚本中导入的任何模块,这个内置 __name__ 变量会设为该模块的名称。因此,条件 if __name__ == "__main__"会检查该模块是否为主程序。 

    尝试一下!

    下面是我在上述视频中使用的代码。请在同一目录下创建这些脚本,并在终端里运行这些脚本!实验 if main 块并访问导入模块中的对象!

    # demo.py
    
    import useful_functions as uf
    
    scores = [88, 92, 79, 93, 85]
    
    mean = uf.mean(scores)
    curved = uf.add_five(scores)
    
    mean_c = uf.mean(curved)
    
    print("Scores:", scores)
    print("Original Mean:", mean, " New Mean:", mean_c)
    
    print(__name__)
    print(uf.__name__)
    
    # useful_functions.py
    
    def mean(num_list):
        return sum(num_list) / len(num_list)
    
    def add_five(num_list):
        return [n + 5 for n in num_list]
    
    def main():
        print("Testing mean function")
        n_list = [34, 44, 23, 46, 12, 24]
        correct_mean = 30.5
        assert(mean(n_list) == correct_mean)
    
        print("Testing add_five function")
        correct_list = [39, 49, 28, 51, 17, 29]
        assert(add_five(n_list) == correct_list)
    
        print("All tests passed!")
    
    if __name__ == '__main__':
        main()

    标准库

    你可以在 Python 一周模块博客中发现新的模块。

    我们的推荐模块

    Python 标准库包含大量模块!为了帮助你熟悉那些实用的模块,我们在下面筛选了一些我们推荐的 Python 标准库模块并解释为何我们喜欢使用它们! 

    • csv:对于读取 csv 文件来说非常便利 
    • collections:常见数据类型的实用扩展,包括 OrderedDictdefaultdict 和 namedtuple
    • random:生成假随机数字,随机打乱序列并选择随机项 
    • string:关于字符串的更多函数。此模块还包括实用的字母集合,例如 string.digits(包含所有字符都是有效数字的字符串)。 
    • re:通过正则表达式在字符串中进行模式匹配 
    • math:一些标准数学函数 
    • os:与操作系统交互 
    • os.pathos 的子模块,用于操纵路径名称 
    • sys:直接使用 Python 解释器 
    • json:适用于读写 json 文件(面向网络开发)

    希望你能用上这些模块!

    导入模块技巧

    还有一些在不同情形下很有用的其他形式的 import 语句。

    1. 要从模块中导入单个函数或类:
      from module_name import object_name
      
    2. 要从模块中导入多个单个对象:
      from module_name import first_object, second_object
      
    3. 要重命名模块:
      import module_name as new_name
      
    4. 要从模块中导入对象并重命名:
      from module_name import object_name as new_name
      
    5. 要从模块中单个地导入所有对象(请勿这么做):
      from module_name import *
      
    6. 如果你真的想使用模块中的所有对象,请使用标准导入 module_name 语句并使用点记法访问每个对象。
      import module_name

    模块、软件包和名称

    为了更好地管理代码,Standard 标准库中的模块被拆分成了子模块并包含在软件包中。软件包是一个包含子模块的模块。子模块使用普通的点记法指定。

    子模块的指定方式是软件包名称、点,然后是子模块名称。你可以如下所示地导入子模块。

    import package_name.submodule_name

    第三方库

    独立开发者编写了成千上万的第三方库!你可以使用 pip 安装这些库。pip 是在 Python 3 中包含的软件包管理器,它是标准 Python 软件包管理器,但并不是唯一的管理器。另一个热门的管理器是 Anaconda,该管理器专门针对数据科学。

    要使用 pip 安装软件包,在命令行中输入“pip install”,然后是软件包名称,如下所示:pip install package_name。该命令会下载并安装该软件包,以便导入你的程序中。安装完毕后,你可以使用从标准库中导入模块时用到的相同语法导入第三方软件包。

    使用 requirements.txt 文件

    大型 Python 程序可能依赖于十几个第三方软件包。为了更轻松地分享这些程序,程序员经常会在叫做 requirements.txt 的文件中列出项目的依赖项。下面是一个 requirements.txt 文件示例。

    beautifulsoup4==4.5.1
    bs4==0.0.1
    pytz==2016.7
    requests==2.11.1
    

    该文件的每行包含软件包名称和版本号。版本号是可选项,但是通常都会包含。不同版本的库之间可能变化不大,可能截然不同,因此有必要使用程序作者在写程序时用到的库版本。

    你可以使用 pip 一次性安装项目的所有依赖项,方法是在命令行中输入 pip install -r requirements.txt

    实用的第三方软件包

    能够安装并导入第三方库很有用,但是要成为优秀的程序员,还需要知道有哪些库可以使用。大家通常通过在线推荐或同事介绍了解实用的新库。如果你是一名 Python 编程新手,可能没有很多同事,因此为了帮助你了解入门信息,下面是优达学城工程师很喜欢使用的软件包列表。(可能部分网站在国内网络中无法打开)

    • IPython - 更好的交互式 Python 解释器 
    • requests - 提供易于使用的方法来发出网络请求。适用于访问网络 API。 
    • Flask - 一个小型框架,用于构建网络应用和 API。
    • Django - 一个功能更丰富的网络应用构建框架。Django 尤其适合设计复杂、内容丰富的网络应用。 
    • Beautiful Soup - 用于解析 HTML 并从中提取信息。适合网页数据抽取。 
    • pytest - 扩展了 Python 的内置断言,并且是最具单元性的模块。 
    • PyYAML - 用于读写 YAML 文件。 
    • NumPy - 用于使用 Python 进行科学计算的最基本软件包。它包含一个强大的 N 维数组对象和实用的线性代数功能等。 
    • pandas - 包含高性能、数据结构和数据分析工具的库。尤其是,pandas 提供 dataframe! 
    • matplotlib - 二维绘制库,会生成达到发布标准的高品质图片,并且采用各种硬拷贝格式和交互式环境。 
    • ggplot - 另一种二维绘制库,基于 R's ggplot2 库。
    • Pillow - Python 图片库可以向你的 Python 解释器添加图片处理功能。 
    • pyglet - 专门面向游戏开发的跨平台应用框架。 
    • Pygame - 用于编写游戏的一系列 Python 模块。 
    • pytz - Python 的世界时区定义。

    在解释器中进行实验

    通过在终端里输入 python 启动 python 交互式解释器。你可以接着输入内容,直接与 Python 交互。这是每次实验和尝试一段 Python 代码的很棒工具。只需输入 Python 代码,输出将出现在下一行。

    >>> type(5.23)
    <class 'float'>
    

    在解释器中,提示符窗口中最后一行的值将自动输出。如果有多行代码需要输出值,依然需要使用 print。

    如果你开始定义函数,你将在提示符窗口中看到变化,表示这是可以继续的行。在定义函数时,你需要自己添加缩进。

    >>> def cylinder_volume(height, radius):
    ...         pi = 3.14159
    ...         return height * pi * radius ** 2
    

    解释器的不足之处是修改代码比较麻烦。如果你在输入该函数时出现了拼写错误,或者忘记缩进函数的主体部分,无法使用鼠标将光标点到要点击的位置。需要使用箭头键在代码行中来回移动。有必要了解一些实用的快捷方式,例如移到一行的开头或结尾。

    注意,我可以引用我在解释器中之前定义的任何对象!

    >>> cylinder_volume(10, 3)
    282.7431
    

    一个实用技巧是在交互式提示符窗口中使用上下箭头键循环浏览最近的命令。这样可以重新运行或修改已经尝试的代码。

    要退出 Python 交互式解释器,使用命令 exit() 或在 mac/linux 上按下 ctrl+D,在 windows 上按下 ctrl+Z,然后按下 Enter 键。

    IPython

    实际上有一个代替默认 python 交互式解释器的强大解释器 IPython,它具有很多其他功能。

    • Tab 键补充完整
    • ?:关于对象的详细信息
    • !:执行系统 shell 命令
    • 语法突出显示

    你可以在此处查看更多其他功能!

    获取所需的信息

    要想成为熟练的程序员,需要掌握大量知识。需要了解库、记住语法以及其他细节。此外,让这一切更具挑战的是,技术在不断革新,因为新的技巧和工具会不断出现。

    对于编程新手来说,学习所有这些细节并及时获悉新的发展动态似乎是一项不可能完成的任务。的确是这样!具有多年经验的编程专业人士实际上并不是在脑中记下百科全书一样的知识,而是掌握了快速查找信息的技巧。

    如何搜索

    下面是高效网络搜索的一些技巧:

    • 在查询时,尝试使用 Python 或要使用的库的名称作为第一个字词。这样会告诉搜索引擎优先显示与你要使用的工具明确相关的结果。
    • 创建良好的搜索查询需要多次尝试。如果第一次尝试时没有找到有用的结果,再试一遍。 
    • 尝试使用在一开始搜索时发现的网页上发现的关键字,使搜索引擎在后续搜索中转到更好的资源。
    • 复制粘贴错误消息作为搜索字词。这样会出现错误解释性信息和潜在原因。错误消息可能包括你所写的特定行号引用。只在搜索中包含这些信息之前的错误消息部分。
    • 如果找不到问题答案,自己提出问题!StackOverflow 等社区有一些行为规则,如果你要加入该社区,必须了解这些规则,但是别因为这些规则而不愿意使用这些资源。

    在线资源的优先级

    虽然有很多关于编程的在线资源,但是并非所有资源都是同等水平的。下面的资源列表按照大致的可靠性顺序排序。

    1. Python 教程 - 这部分官方文档给出了 Python 的语法和标准库。它会举例讲解,并且采用的语言比主要文档的要浅显易懂。确保阅读该文档的 Python 3 版本!
    2. Python 语言和库参考资料 - 语言参考资料和库参考资料比教程更具技术性,但肯定是可靠的信息来源。当你越来越熟悉 Python 时,应该更频繁地使用这些资源。
    3. 第三方库文档 - 第三方库会在自己的网站上发布文档,通常发布于 https://readthedocs.org/ 。你可以根据文档质量判断第三方库的质量。如果开发者没有时间编写好的文档,很可能也没时间完善库。
    4. 非常专业的网站和博客 - 前面的资源都是主要资源,他们是编写相应代码的同一作者编写的文档。主要资源是最可靠的资源。次要资源也是非常宝贵的资源。次要资源比较麻烦的是需要判断资源的可信度。Doug Hellmann 等作者和 Eli Bendersky 等开发者的网站很棒。不出名作者的博客可能很棒,也可能很糟糕。
    5. StackOverflow - 这个问答网站有很多用户访问,因此很有可能有人之前提过相关的问题,并且有人回答了!但是,答案是大家自愿提供的,质量参差不齐。在将解决方案应用到你的程序中之前,始终先理解解决方案。如果答案只有一行,没有解释,则值得怀疑。你可以在此网站上查找关于你的问题的更多信息,或发现替代性搜索字词。
    6. Bug 跟踪器 - 有时候,你可能会遇到非常罕见的问题或者非常新的问题,没有人在 StackOverflow 上提过。例如,你可能会在 GitHub 上的 bug 报告中找到关于你的错误的信息。这些 bug 报告很有用,但是你可能需要自己开展一些工程方面的研究,才能解决问题。
    7. 随机网络论坛 - 有时候,搜索结果可能会生成一些自 2004 年左右就不再活跃的论坛。如果这些资源是唯一解决你的问题的资源,那么你应该重新思考下寻找解决方案的方式。
    展开全文
  • secureCRT脚本编写

    万次阅读 2016-11-22 09:58:48
    secureCRT脚本编写secureCRT脚本编写 脚本编写实例 python脚本 js脚本 secureCRT支持三种脚本语言:vbs,Js,python。三种脚本分别以一下三种形式开头://vbs # $language = "VBScript" # $interface = "1.0" //js # $...

    secureCRT脚本编写

    secureCRT支持三种脚本语言:vbs,Js,python。三种脚本分别以一下三种形式开头:

    //vbs
    # $language = "VBScript"
    # $interface = "1.0"
    //js
    # $language="JScript"
    # $interface="1.0"
    //python
    # $language = "Python"
    # $interface = "1.0"

    脚本编写实例

    下面分别以三种脚本编写telnet到一个服务器例子
    登陆时的效果

    python脚本

    # $language = "python"
    # $interface = "1.0"
    #此方法表示你必须先登录一台服务器然后再去telnet到另外一台服务器
    #主机的ip
    host = '11.1.1.1'
    #主机的用户名
    user = 'root'
    #主机的密码
    passwd = 'password'
    
    def main():
        #向屏幕光标后发送以下文字内容,\r表示回车执行
        crt.Screen.Send('telnet '+host+'\r')
        crt.Screen.WaitForString('login:')  
        crt.Screen.Send(user+"\r")
        crt.Screen.WaitForString('password:') 
        crt.Screen.Send(passwd+"\r")
        #使用默认弹窗提示信息
        crt.Dialog.MessageBox('登录成功!')
    
    main()

    js脚本

    # $language="JScript"
    # $interface="1.0"
    #主机的ip
    host = '11.1.1.1'
    #主机的用户名
    user = 'root'
    #主机的密码
    passwd = 'password'
    crt.screen.Send("telnet "+host+"\n");
    crt.screen.WaitForString("login:");
    crt.screen.Send(root+"\n");
    crt.screen.WaitForString("password:");
    crt.screen.Send(passwd+"\n");
    #使用默认弹窗提示信息
    crt.Dialog.MessageBox('登录成功!')
    
    展开全文
  • BAT脚本编写教程简单入门篇

    万次阅读 多人点赞 2017-08-16 14:20:22
    BAT脚本编写教程简单入门篇

    批处理文件最常用的几个命令:

    echo表示显示此命令后的字符 

    echo on  表示在此语句后所有运行的命令都显示命令行本身 
    echo off 表示在此语句后所有运行的命令都不显示命令行本身
    @与echo off相像,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
    call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
    pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
    rem 表示此命令后的字符为注释,不执行。

    title BAT的标题

    cls 清除屏幕


    开始例子:

    @ECHO OFF
    TITLE BAT脚本例子1
    echo -----------枚举C盘目录下所有文件-----------
    echo=
    echo=
    dir c:\*.*
    rem 输出到文本文件
    dir c:\*.* > example1.txt
    echo=
    echo=
    echo --------------------------------------------
    PAUSE

    echo= 表示输出空白行,关于空白行的输出还有其他方式,具体可参考网址:

    http://blog.sina.com.cn/s/blog_4b466ad00101dfqu.html

    若输入PAUSE>NUL 则表示暂停且不提示“按下任意键继续”。


    设置字体颜色和窗体大小:

    设置字体颜色:COLOR 02 (0代表背景色,2代表前景色)

    常用的颜色有以下值:0 黑色,1蓝色,2 绿色,3 浅绿色,4红色,5紫色,6黄色,7白色,8灰色,9浅蓝,A浅绿,B浅蓝色,C浅红色,D浅紫色,E浅黄色,F亮白色)。

    设置窗体大小:MODE CON: COLS=宽度 LINES=高度


    文件夹简单操作:

    @ECHO OFF
    TITLE BAT脚本例子2
    COLOR A
    echo -----------BAT脚本例子2-----------
    echo=
    echo=
    echo  当前工作路径为:%cd%
    rem 输出文件目录的树形目录
    TREE /f >tree_list.txt
    rem CD切换不同盘符时候需要加上/d
    CD /D C:\
    echo  当前工作路径为:%cd%
    DIR
    rem 创建目录bat_example2
    MD bat_example2
    DIR
    rem 拷贝目录 /s /e /y 说明:在复制文件的同时也复制空目录或子目录,如果目标路径已经有相同文件了,使用覆盖方式而不进行提示
    Xcopy C:\bat_example2 D:\bat_example2  /s /e /y
    
    rem 删除目录bat_example2
    rem RD /Q /S bat_example2
    rem DIR
    echo=
    echo=
    echo --------------------------------------------
    PAUSE
    关于文件夹的其他操作,可参考网址:http://www.jb51.net/article/11313.htm

    文件操作

    @ECHO OFF
    TITLE BAT脚本例子3
    COLOR A
    echo -----------BAT脚本例子3-----------
    echo=
    echo=
    TYPE tree_list1.txt
    rem 复制(合并)文件 /Y 表示目标路径存在该文件则不提示直接覆盖
    COPY /Y tree_list2.txt + tree_list3.txt C:\
    
    DEL tree_list4.txt /f /s /q /a 
    rem /f 表示强制删除文件 
    rem /s表示子目录都要删除该文件 
    rem /q表示无声,不提示 
    rem /a根据属性选择要删除的文件 
    
    rem 需要特别注意的是:move不能跨分区移动文件夹
    MOVE example3 example3_1
    echo=
    echo=
    echo --------------------------------------------
    PAUSE

    网络命令

    @ECHO OFF
    TITLE BAT脚本例子4
    COLOR A
    echo -----------BAT脚本例子4-----------
    echo= 
    PING www.baidu.com
    echo=
    echo -----------------------------------
    IPCONFIG
    echo=
    echo -----------------------------------
    ARP 
    echo=
    echo -----------------------------------
    PAUSE

    系统相关

    @ECHO OFF
    TITLE BAT脚本例子5
    COLOR A
    echo -----------BAT脚本例子5-----------
    echo= 
    echo -----------显示计算机用户-----------
    NET USER
    echo=
    echo -----------显示进程列表-----------
    TASKLIST
    echo=
    echo -----------------------------------
    PAUSE

           最后总结,其实BAT主要是运用DOS命令,所以只要掌握好DOS命令,使用BAT就轻松多了。当然,BAT实际运用并不只是这些简单的命令,还有比较复杂的语法,将在下一篇做介绍。


    参考网址:http://www.jb51.net/article/49627.htm










    展开全文
  • Android自动化测试之Monkey命令使用及monkey脚本编写

    万次阅读 多人点赞 2018-06-29 16:22:14
    Android自动化测试之Monkey使用及monkey脚本编写 Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放 背景 如果开发完app,开发人员没有充分的...

    系列文章

    Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解

    Android自动化测试之Monkey使用及monkey脚本编写

    Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放

    背景

    如果开发完app,开发人员没有充分的自测,然后等到测试人员反馈bug的时候已经晚了,所以作为一个合格的程序猿,很有必要掌握测试技术,也就是自动化测试了,将bug摁死在开发阶段;我们总不能花一天在那用手点点点吧,不现实,想想你晚上下班,把自动化测试一开,放在办公室跑一晚上,第二天过来直接看结果,这多嗨。

    其实现在市面上有很多自动化测试平台,做的都很全面了,而且还提供了很多机型供你选择,比如:

    •  腾讯优测云测试平台
    • 华为开发者联盟
    • Testin 云测

    唯一一个缺点就是【收费】,本着为公司着想还是我们自己动手吧。

    现在通用的一些测试工具如下:

    1. Monkey:Android SDK自带的一个黑盒测试命令行工具,使用adb来运行它,运行在设备端,向系统发送伪随机的用户事件流,如按键、触屏、输入等,来确定应用是否会发生异常,并伴随着日志输出。实际上该工具只能对程序做一些压力测试或者稳定性测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。
    2. MonkeyRunner:Android SDK自带的一个黑盒测试工具,位于tools目录下,比Monkey强大,可以编写脚本来自定义数据,事件;但是脚本是采用python语言编写的,其实就是对python进行了封装,对测试人员要求较高。
    3. Instrumentation:这个是Google早期提供的测试自动化测试工具类,可以看成是Android的一个组件,可以模拟用户众多事件,通常用来单元测试,对测试人员要求较高,需要了解Android的api。
    4. UiAutomator:Android提供的自动化测试框架,也是前两年最佳的UI测试框架,基本上支持所有的用户事件,可以抓取APP页面控件属性,测试代码结构简单,编写容易,能跨APP测试,但是要求设备在Android4.1以上,不支持Hybird APP,WebApp。
    5. Appium:这应该是最近很火的一个测试框架,支持Native APP,Hybird APP,Web APP;可以跨平台在Windows,Mac,Linux使用,支持Android,ios;支持java,js,php,Python等语言编写测试脚本。

    本篇文章从Monkey开始介绍自动化测试,内容如下:

    1. monkey命令和参数详细介绍
    2. monkey命令的使用
    3. monkey脚本方法介绍和编写
    4. monkey server命令介绍和使用

    Monkey命令介绍

    monkey命令格式:adb shell monkey [options] <event-count>;其中options值有很多选项,可以在Monkey官网查看,也可以输入命令 adb shell monkey -help 可以查看到其对应的所有值(方便使用,需要将adb添加到环境变量)

     

    1. -p 用于约束限制,用此参数指定一个包,指定包后Monkey将被允许启动指定应用;如果不指定包,  Monkey将被允许随机启动设备中的应用(主Activity有android.intent.category.LAUNCHER 或android.intent.category.MONKEY类别 )。比如 adb shell monkey -p xxx.xxx.xxx 1  ; xxx.xxx.xxx 表示应用包名,1 表示monkey模拟用户随机事件参数,最低1,这样就能把应用启动起来
    2. -c 指定Activity的category类别,如果不指定,默认是CATEGORY_LAUNCHER 或者 Intent.CATEGORY_MONKEY;不太常用的一个参数
    3. -v 用于指定反馈信息级别,也就是日志的详细程度,分Level1、Level2、Level3;-v 默认值,仅提供启动提示,操作结果等少量信息 ,也就是Level1,比如adb shell monkey -p  xxx.xxx.xxx -v 1 ;-v -v 提供比较详细信息,比如启动的每个activity信息 ,也就是Level2,比如adb shell monkey -p xxx.xxx.xxx -v -v 1 ;-v -v -v 提供最详细的信息 ,比如adb shell monkey -p xxx.xxx.xxx -v -v -v 1 
    4. -s 伪随机数生成器的种子值,如果我们两次monkey测试事件使用相同的种子值,会产生相同的事件序列;如果不指定种子值,系统会产生一个随机值。种子值对我们复现bug很重要。使用如下adb shell monkey -p xxx.xxx.xxx -s 11111 10;这也是伪随机事件的原因,因为这些事件可以通过种子值进行复现
    5. --ignore-crashes 忽略异常崩溃,如果不指定,那么在monkey测试的时候,应用发生崩溃时就会停止运行;如果加上了这个参数,monkey就会运行到指定事件数才停止。比如adb shell monkey -p xxx.xxx.xxx -v -v -v  --ignore-crashes 10 
    6. --ignore-timeouts 忽略ANR,情况与4类似,当发送ANR时候,让monkey继续运行。比如adb shell monkey -p xxx.xxx.xxx -v -v -v  --ignore-timeouts 10
    7. --ignore-native-crashes 忽略native层代码的崩溃,情况与4类似,比如adb shell monkey -p xxx.xxx.xxx -v -v -v  --ignore-native-crashes 10
    8. --ignore-security-exceptions 忽略一些许可错误,比如证书许可,网络许可,adb shell monkey -p xxx.xxx.xxx -v -v -v  --ignore-security-exceptions 10
    9. --monitor-native-crashes 是否监视并报告native层发送的崩溃代码,adb shell monkey -p xxx.xxx.xxx -v -v -v  --monitor-native-crashes 10
    10. --kill-procress-after-error 用于在发送错误后杀死进程
    11. --hprof  设置后,在Monkey事件序列之前和之后立即生产分析报告,保存于data/mic目录,不过将会生成大量几兆文件,谨慎使用
    12. --throttle 设置每个事件结束后延迟多少时间再继续下一个事件,降低cpu压力;如果不设置,事件与事件之间将不会延迟,事件将会尽快生成;一般设置300ms,因为人最快300ms左右一个动作,比如 adb shell monkey -p xxx.xxx.xxx -v -v -v  --throttle 300 10
    13. --pct-touch 设置触摸事件的百分比,即手指对屏幕进行点击抬起(down-up)的动作;不做设置情况下系统将随机分配各种事件的百分比。比如adb shell monkey -p xxx.xxxx.xxx --pct-touch 50 -v -v 100 ,这就表示100次事件里有50%事件是触摸事件
    14. --pct-motion 设置移动事件百分比,这种事件类型是由屏幕上某处的一个down事件-一系列伪随机的移动事件-一个up事件,即点击屏幕,然后直线运动,最后抬起这种运动。
    15. --pct-trackball 设置轨迹球事件百分比,这种事件类型是一个或者多个随机移动,包含点击事件,这里可以是曲线运动,不过现在手机很多不支持,这个参数不常用
    16. --pct-syskeys 设置系统物理按键事件百分比,比如home键,音量键,返回键,拨打电话键,挂电话键等
    17. --pct-nav 设置基本的导航按键事件百分比,比如输入设备上的上下左右四个方向键
    18. --pct-appswitch 设置monkey使用startActivity进行activity跳转事件的百分比,保证界面的覆盖情况
    19. --ptc-anyevent 设置其它事件百分比
    20. --ptc-majornav 设置主导航事件的百分比
    21. 保存dos窗口打印的monkey信息,在monkey命令后面补上输出地址,如adb shell monkey -p xxx.xxxx.xxx  -v -v 100 > D:\monkey.txt;这样monkey测试结束后,所有打印的信息都会输出到这个文件里
    22. 通过adb bugreport 命令可以获取整个android系统在运行过程中所有app的内存使用情况,cpu使用情况,activity运行信息等,包括出现异常等信息。使用方法 adb bugreport > bugreport.txt ;这样在当前目录就会产生一个txt文件和一个压缩包,具体信息可在压缩包查看,txt文件只会记录压缩包的生成过程信息
    23. -f 加载monkey脚本文件进行测试,比如 adb shell monkey -f sdcard/monkey.txt -v -v 500

    Monkey使用

    1.进入adb目录

    2.通过adb install apk名字

    3.输入adb shell monkey -p xxx.xxxx.xxx  -s 123123 --throttle 300 -v -v 20 > d:\monkey.txt,这里指定了seed值,每个事件之间休息300ms,执行了20个事件,然后将日志信息保存在了monkey.txt文件中

    4.打开文件,查看信息如下:

    Monkey: seed=123123 count=20 //本次事件序列seed值是指定的123123,方便出现bug后再复现 执行事件次数是20
    :AllowPackage: com.android.mangodialog // 被测试的应用包名
    :IncludeCategory: android.intent.category.LAUNCHER //启动的主activity的两种类别
    :IncludeCategory: android.intent.category.MONKEY
    // Selecting main activities from category android.intent.category.LAUNCHER
    //   + Using main activity com.android.mangodialog.MainActivity (from package com.android.mangodialog) //该应用符合这种类别的activity
    // Selecting main activities from category android.intent.category.MONKEY
    // Seeded: 123123
    // Event percentages://各种事件的百分比,不同厂家设备可能有所不同
    //   0: 15.0%  //可通过--pct-touch 参数设置的事件的百分比 常用
    //   1: 10.0%  //可通过--pct-motion 参数设置的事件的百分比 常用
    //   2: 2.0%   //可通过--pct-pinchzoom 参数设置的事件的百分比
    //   3: 15.0%  //可通过--pct-trackball 参数设置的事件的百分比
    //   4: -0.0%  
    //   5: -0.0%  
    //   6: 25.0%  //可通过--pct-nav 参数设置的事件的百分比
    //   7: 15.0%  //可通过--pct-majornav 参数设置的事件的百分比
    //   8: 2.0%   //可通过--pct-syskeys 参数设置的事件的百分比 常用
    //   9: 2.0%   //可通过--pct-appswitch 参数设置的事件的百分比 常用
    //   10: 1.0%  //可通过--pct-flip 参数设置的事件的百分比
    //   11: 13.0% //可通过--pct-anyevent 参数设置的事件的百分比 
    //启动应用的activity
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.mangodialog/.MainActivity;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.mangodialog/.MainActivity } in package com.android.mangodialog
    Sleeping for 300 milliseconds //设置的事件之间间隔300ms 下面就是执行点击事件
    :Sending Key (ACTION_DOWN): 82    // KEYCODE_MENU
    :Sending Key (ACTION_UP): 82    // KEYCODE_MENU
    Sleeping for 300 milliseconds
    :Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER
    :Sending Key (ACTION_UP): 23    // KEYCODE_DPAD_CENTER
    Sleeping for 300 milliseconds
        // Allowing start of Intent { cmp=com.android.mangodialog/.MainActivity2 } in package com.android.mangodialog
    :Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
    :Sending Key (ACTION_UP): 22    // KEYCODE_DPAD_RIGHT
    Sleeping for 300 milliseconds
    :Sending Key (ACTION_DOWN): 21    // KEYCODE_DPAD_LEFT
    :Sending Key (ACTION_UP): 21    // KEYCODE_DPAD_LEFT
    Sleeping for 300 milliseconds
    :Sending Touch (ACTION_DOWN): 0:(1017.0,280.0)
    :Sending Touch (ACTION_UP): 0:(1021.8751,281.12732)
    Sleeping for 300 milliseconds
    :Sending Touch (ACTION_DOWN): 0:(1005.0,1599.0)
    :Sending Touch (ACTION_UP): 0:(994.4962,1589.7715)
    Sleeping for 300 milliseconds
    :Sending Key (ACTION_DOWN): 2    // KEYCODE_SOFT_RIGHT
    :Sending Key (ACTION_UP): 2    // KEYCODE_SOFT_RIGHT
    Sleeping for 300 milliseconds
    :Sending Key (ACTION_DOWN): 20    // KEYCODE_DPAD_DOWN
    :Sending Key (ACTION_UP): 20    // KEYCODE_DPAD_DOWN
    Sleeping for 300 milliseconds
    :Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
    :Sending Key (ACTION_UP): 22    // KEYCODE_DPAD_RIGHT
    Sleeping for 300 milliseconds //轨迹球运动
    :Sending Trackball (ACTION_MOVE): 0:(4.0,-5.0)//手机屏幕上的坐标
    Events injected: 20 //monkey共执行了20次事件
    :Sending rotation degree=0, persist=false
    :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
    //测试过程中的网络状态,花费了3064ms连接,既没有连接上手机网络,也没有连接上wifi
    ## Network stats: elapsed time=3064ms (0ms mobile, 0ms wifi, 3064ms not connected) 
    
    // Monkey finished //monkey测试结束

    5.平时会使用比较复杂的参数去测试,如下

    adb shell monkey -v -v -v -s 123123 --throttle 300 --pct-touch 40 --pct-motion 25 --pct-appswitch 25 --pct-syskeys 10 --pct-majornav 0 --pct-nav 0 --pct-trackball 0 --ignore-crashes --ignore-timeouts --ignore-native-crashes -p xxx.xxx.xxx 100000 > d:\monkey.txt

    具体什么意思就不再一一解释了。

    6.其实我们比较关注的是app在使用过程中出现的错误信息,像上面我们选择忽略掉错误情况,这样当monkey执行结束后,相关的信息会被写入到monkey文件中,但是错误信息比如crash,anr等信息会打印在dos窗口,这些错误信息会明确的指出哪里发生的错误;如果需要复现,我们可以把忽略参数去掉,然后通过相同的seed值再次进行monkey测试,直到发生错误跳出monkey测试,我们再查看,如下

    public class MainActivity2 extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.act_main2);
            float s = 1/0;
        }
    }

    我这第二个activity的oncreate方法中写这个会报错的代码,然后在第一个activity的一个按钮中进行跳转进入这个activity,接下来进行monkey测试来复现这个bug

    adb shell monkey -p xxx.xxx.xxx -s 123456 -v -v 2000  > d:\monkey.txt

    我们看这个文件

    :Sending Trackball (ACTION_MOVE): 0:(4.0,-3.0)
    :Sending Trackball (ACTION_MOVE): 0:(-2.0,1.0)
    :Sending Trackball (ACTION_DOWN): 0:(0.0,0.0)
    :Sending Trackball (ACTION_UP): 0:(0.0,0.0)
    Sleeping for 300 milliseconds
        // Allowing start of Intent { cmp=com.android.mangodialog/.MainActivity2 } in package com.android.mangodialog
    ** Monkey aborted due to error.
    
    Events injected: 190

    这里可以看到是当打开MainActivity2的时候monkey发生错误退出,只执行了190个事件。至于错误信息打印在了dos窗口。

    这里我们也可以通过adb bugreport命令将手机运行日志导出来查看,这里面的信息更详细,包括出错信息。

    
    //6.0及以下设备
    adb bugreport > bugreport.txt
    //7.0及以上设备
    adb bugreport bugreport.zip

    Monkey脚本

    monkeyscript是monkey的脚本语言,能够被monkey识别的命令集合,可以实现一些固定的重复性动作。Monkey可以通过命令加载脚本来进行测试,简单方便。Monkey脚本如何编写,官网并没有介绍,我们只能通过Moneky源码去学习如何编写脚本,可参考Monkey-GithubMonkeySourceScript.java

    脚本格式如下

    type= raw events
    count= 1
    speed= 1.0   
    start data >>   
    
    LaunchActivity(pkg_name, cl_name)  
    1. 第一句到第三局就使用默认值,不需要改,其实这里设置是无效的,最终会采用命令行里的值;
    2. start data >> 表示开始执行下面所有的命令行
    3. LaunchActivity就是一个启动应用的命令

    脚本命令

    1. LaunchActivity(pkg_name, cl_name): 启动应用,第一个参数是包名,第二个是启动的activity名
    2. DispatchPointer(downtime,eventTime,action,x,y,xpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags) :向指定位置发送单个手势,相当于我们把手指按在某个点上;这个方法参数有12个,但是我们主要关注owntime,eventTime,action,x,y这么几个参数,x,y表示按下的坐标,可以通过上一篇文章UI Automator获取,这在你想测试点击某个具体view是很有用的
    3. DispatchPress(keycode): 向系统发送一个固定的按键事件;例如home键,back键;参数是按键值 ,按键值可查看keycode
    4. UserWait:让脚本的执行暂停一段时间,做一个等待操作
    5. RotateScreen(rotationDegree, persist): 翻转屏幕,第一个参数是旋转角度,第二个是旋转后是否停在当前位置
    6. Tap(x, y) :单击事件,点击屏幕,参数是点击坐标
    7. Drag(xStart, yStart, xEnd, yEnd) :在屏幕上滑动,坐标是从哪一点滑到哪一点
    8. LongPress(): 长按2s
    9. ProfileWait(): 等待5s
    10. PressAndHold(x, y, pressDuration) :模拟长按 
    11. PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放
    12. DispatchString(input): 输入字符串
    13. RunCmd(cmd) :执行shell命令,比如截图 screencap -p /data/local/tmp/tmp.png
    14. DispatchFlip(true/false) :打开或者关闭软键盘
    15. UserWait(sleepTime) :睡眠指定时间
    16. DeviceWakeUp() :唤醒屏幕

    编写脚本

    type= raw events
    count= 1
    speed= 1.0   
    start data >>   
    
    LaunchActivity(com.android.mangodialog,com.android.mangodialog.MainActivity);
    UserWait(1000);
    # 按下
    DispatchPointer(0,0,0,400,500,0,0,0,0,0,0,0) 
    # 抬起
    DispatchPointer(0,0,1,400,500,0,0,0,0,0,0,0) 
    UserWait(1000);
    
    Tab(500,300);
    UserWait(1000);
    
    DispatchPress(KEYCODE_ENTER)
    UserWait(1000);
    
    DispatchPress(KEYCODE_BACK);
    UserWait(1000);
    
    RunCmd(screencap -p /sdcard/tmp.png);
    UserWait(1000);
    
    Drag(0, 0, 500, 500);
    UserWait(1000);
    
    RotateScreen(90,1)
    UserWait(1000);
    
    DispatchString(www.baidu.com);
    UserWait(1000);
    
    DispatchPress(KEYCODE_BACK);
    UserWait(1000);
    • 脚本需要对照着MonkeySourceScript.java文件编写,这样才能知道方法需要多少个参数,参数有什么含义;同时要注意方法名是区分大小写的,其实最重要的是脚本的编写需要根据你的测试用例来写,一步步怎么操作就写上对应的方法
    • 因为Monkey是运行在设备上的,所以需要将脚本先传到设备上,通过adb push d:\monkey.txt sdcard/monkey.txt 将文件推送到手机sd卡上
    • 最后通过adb shell monkey -f sdcard/monkey.txt -v -v 1 执行脚本文件

    Monkey Server

    monkey server是官方文档中没有提到的一个隐藏功能,monkey其实是可以在设备上启动一个服务端,提供了远程访问设备并控制设备执行的能力。在monkey上面列出的参数中,我们可以看到有一个--port的参数,它提供的就是Monkey启动server,并控制设备执行的功能

    • 启动Monkey Server:adb shell monkey --port 1080,开放设备的1080端口
    • 连接Monkey Server:先输入 adb forward tcp:1080 tcp:1080,将本机端口(前)和设备端口(后)进行映射,再输入telnet 127.0.0.1 1080,这里是通过telnet连接本机的1080端口,就可连接到设备上的Monkey server,并且执行Server中的相关指令

    Monkey Server命令

    • key [down|up] keycode -- 指定Keycode的按键事件(分按下、弹起)
    • touch [down|up|move] x y -- 指定坐标的触屏操作(分按下、弹起、移动)
    • trackball dx dy -- 轨迹球操作
    • tap x y -- 指定坐标的触屏操作
    • flip [open|close] -- 调用软键盘
    • wake -- 唤醒设备
    • press keycode -- 指定Keycode的按键事件
    • listvar -- 列出所有的系统变量
    • getvar varname -- 获取给定系统变量值
    • quit -- 退出当前连接,且不接受新的连接
    • done -- 退出当前连接,但可以接受新的连接
    • type -- 输入字符

    命令执行成功会返回OK的响应,如果执行错误则返回error command;注意操作退出telnet前,需要执行done指令,否则再次连接,会报端口已占用的错误。只能重启设备以释放端口

    server的相关命令在官网也没有介绍,也只能通过源码来分析,有一个文件README.NETWORK.txt进行了一些命令使用的介绍

    SIMPLE PROTOCOL FOR AUTOMATED NETWORK CONTROL
    
    The Simple Protocol for Automated Network Control was designed to be a
    low-level way to programmability inject KeyEvents and MotionEvents
    into the input system.  The idea is that a process will run on a host
    computer that will support higher-level operations (like conditionals,
    etc.) and will talk (via TCP over ADB) to the device in Simple
    Protocol for Automated Network Control.  For security reasons, the
    Monkey only binds to localhost, so you will need to use adb to setup
    port forwarding to actually talk to the device.
    
    INITIAL SETUP
    
    Setup port forwarding from a local port on your machine to a port on
    the device:
    
    $ adb forward tcp:1080 tcp:1080
    
    Start the monkey server
    
    $ adb shell monkey --port 1080
    
    Now you're ready to run commands
    
    COMMAND LIST
    
    Individual commands are separated by newlines.  The Monkey will
    respond to every command with a line starting with OK for commands
    that executed without a problem, or a line starting with ERROR for
    commands that had problems being run.  For commands that return a
    value, that value is returned on the same line as the OK or ERROR
    response.  The value is everything after (but not include) the colon
    on that line.  For ERROR values, this could be a message indicating
    what happened.  A possible example:
    
    key down menu
    OK
    touch monkey
    ERROR: monkey not a number
    getvar sdk
    OK: donut
    getvar foo
    ERROR: no such var
    
    The complete list of commands follows:
    
    key [down|up] keycode
    
    This command injects KeyEvent's into the input system.  The keycode
    parameter refers to the KEYCODE list in the KeyEvent class
    (http://developer.android.com/reference/android/view/KeyEvent.html).
    The format of that parameter is quite flexible.  Using the menu key as
    an example, it can be 82 (the integer value of the keycode),
    KEYCODE_MENU (the name of the keycode), or just menu (and the Monkey
    will add the KEYCODE part).  Do note that this last part doesn't work
    for things like KEYCODE_1 for obvious reasons.
    
    Note that sending a full button press requires sending both the down
    and the up event for that key
    
    touch [down|up|move] x y
    
    This command injects a MotionEvent into the input system that
    simulates a user touching the touchscreen (or a pointer event).  x and
    y specify coordinates on the display (0 0 being the upper left) for
    the touch event to happen.  Just like key events, touch events at a
    single location require both a down and an up.  To simulate dragging,
    send a "touch down", then a series of "touch move" events (to simulate
    the drag), followed by a "touch up" at the final location.
    
    trackball dx dy
    
    This command injects a MotionEvent into the input system that
    simulates a user using the trackball. dx and dy indicates the amount
    of change in the trackball location (as opposed to exact coordinates
    that the touch events use)
    
    flip [open|close]
    
    This simulates the opening or closing the keyboard (like on dream).
    
    wake
    
    This command will wake the device up from sleep and allow user input.
    
    tap x y
    The tap command is a shortcut for the touch command.  It will
    automatically send both the up and the down event.
    
    press keycode
    
    The press command is a shortcut for the key command.  The keycode
    paramter works just like the key command and will automatically send
    both the up and the down event.
    
    type string
    
    This command will simulate a user typing the given string on the
    keyboard by generating the proper KeyEvents.
    
    listvar
    
    This command lists all the vars that the monkey knows about.  They are
    returned as a whitespace separated list.
    
    getvar varname
    
    This command returns the value of the given var.  listvar can be used
    to find out what vars are supported.
    
    quit
    
    Fully quit the monkey and accept no new sessions.
    
    done
    
    Close the current session and allow a new session to connect
    
    OTHER NOTES
    
    There are some convenience features added to allow running without
    needing a host process.
    
    Lines starting with a # character are considered comments.  The Monkey
    eats them and returns no indication that it did anything (no ERROR and
    no OK).
    
    You can put the Monkey to sleep by using the "sleep" command with a
    single argument, how many ms to sleep.
    

    Server命令使用

    使用adb shell monkey --port 1080命令在设备端启动monkey server

    这时候打开另一个dos窗口,输入adb forward tcp:1080 tcp:1080进行端口映射

    在这个窗口继续输入telnet 127.0.0.1 1080连接到本机的这个端口,会进到如下窗口

    然后输入上面提到的Server命令就可以了

    其实monkey server也可以执行脚本,不过是.vbs格式的,感觉没有太大的优势,这里就不做过多叙述

     

    展开全文
  • 自动化脚本编写实例-python

    万次阅读 多人点赞 2017-07-03 13:32:15
    自动化脚本编写实例
  • Shell脚本编写实战

    千人学习 2017-10-23 16:55:25
    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量利用率 5...
  • Auto.js脚本编写教程 (一)

    万次阅读 热门讨论 2019-11-05 10:43:39
    Auto.js脚本编写教程 (一) 一、工具下载安装 手机端:<font color=green>auto.js</font>(百度即可) PC端:VS Code JDK SDK Tools(定位工具: Uiautomatorviewer) (注:VS Code 用于代码编写...
  • windows bat 批处理脚本编写指南

    千次阅读 2020-02-01 20:20:45
    本文由浅入深,比较系统地讲解了windows bat 批处理脚本编写指南,包括:windows bat批处理脚本概述,变量使用, 程序返回码及errorlevel使用,stdin、stdout、stderr,if判断与&、&&、||, for循环使用,函数goto...
  • Unity TimeLine的Playable脚本编写

    万次阅读 2019-09-30 16:49:50
    本文就讲TimeLine的PlayAble脚本编写 1.新建Playable Behaveiour,Playable Asset Playable Behaveiour就是playable的生命周期,另一个是Playable 资源,这两个要成套出现 2.Playable Behaveiour生命周期说明 ...
  • MonkeyRunner脚本编写

    千次阅读 2014-03-26 15:59:00
    2. 举例描述一下脚本编写 # -*-coding:utf-8 -*- (允许注释使用中文,便于添加注释,#号标记此行为注释行) from com.android.monkeyrunner importMonkeyRunner, MonkeyDevice, MonkeyImage (调用MonkeyR
  • shell脚本编写计算器

    千次阅读 2018-11-16 14:24:08
    版权声明:本文为博主原创文章,转载请注明CSDN...shell脚本编写计算器: 直接上代码: #!/bin/bash falg="1" while [ "$falg" -eq "1" ] do echo "---shell迷你计算器---...
  • shell脚本编写思路和实例讲解

    万次阅读 多人点赞 2017-06-11 13:18:34
    shell脚本编写思路和实例讲解前言 常听见身边有很多学习shell脚本的朋友抱怨shell脚本不好写,好不容易写出来的脚本一直报错,符号空格又太多,错了一个就无法运行还不好排查错误。 客观讲shell脚本的简洁程度...
  • 自动化脚本编写实例

    千次阅读 2018-02-07 14:39:56
    自动化脚本编写实例 打开浏览器访问pto登陆修改管理员密码单元测试数据检查输入的数据合法性获取输入错误数据之后的页面提示语编写测试用例编写单元测试类 1 单元测试中的通用操作2 测试类 进行...
  • Shell脚本编写

    2012-02-08 17:06:39
    Shell脚本编写 Bash有几个开关和选项对于跟踪调试脚本是非常有用的。“-n”开关可以使你不用运行脚本就可以检查脚本语法的正确性。通常在开发期间使用这个开关来检查脚本的语法。 $ bash -n bad.sh bad.sh: ...
  • 油猴脚本编写教程

    万次阅读 多人点赞 2020-01-28 19:21:06
    油猴脚本(Tampermonkey)是一个非常流行的浏览器扩展,它可以运行由广大社区编写的扩展脚本,来实现各式各样的功能,常见的去广告、修改样式文件、甚至是下载视频。今天我们就来看看如何编写自己的油猴脚本。当然...
  • 自动化测试与脚本编写能力

    千次阅读 2018-11-11 04:22:11
    自动化测试与脚本编写能力
  • Loadrunner脚本编写

    千次阅读 2011-10-28 08:22:48
    http://www.wilsonmar.com/1lrscrīpt.htm上是关于脚本编写的介绍.下面是第一部分,脚本的开发. VuGen脚本文件的开发过程 1。定义测试项目的目标,环境,脚本,测试数据,硬件等。脚本应该符合编码规范或编码习惯...
  • 目前,Jmeter 已经成为性能测试、接口测试主流工具,招聘也基本要求掌握本...实战脚本编写 脚本增强:参数化 脚本增强:关联 脚本增强:断言 脚本增强:思考时间、集合点 HTML 报告生成 JMeter 操作数据库 插件使用 ...
  • 自动化脚本编写规范

    2013-11-05 17:07:33
    自动化测试脚本编写规范(1) 为了使所有的测试工程师在进行自动化设计和测试时能够使编写的脚本风格一致、步骤一致,能够把大家的设计和代码组装在一起,因此有必要对自动化测试脚本编写进行统一的规范化,下面...
  • 010脚本编写入门

    千次阅读 2011-07-18 14:24:51
    010脚本编写入门学过C/C++的您会发现010 Editor的文件解析脚本(即010脚本)看起来跟C/C++的结构体定义比较相似。然而文件解析脚本不是结构体,而是一个自上而下执行的程序,所以它可以使用if、for、while等语句。在...
  • 自动化脚本编写-python

    千次阅读 2019-04-12 18:10:55
    自动化脚本编写实例 打开浏览器访问pto 登陆 修改管理员密码 单元测试数据 检查输入的数据合法性 获取输入错误数据之后的页面提示语 编写测试用例 编写单元测试类 1 单元测试中的通用操作 2 测试类 进行单元测试并...
  • jmeter脚本编写之五类常见请求编写 1.普通post请求 2.普通json请求 3.带query参数的json请求 4.xml请求 5.上传请求 starting (Windows系统 点击 F12 调出开发者工具,选择...
  • linux的bashrc脚本编写

    千次阅读 2018-06-14 15:00:11
    linux的bashrc脚本编写 最近整理以前的笔记时候,翻到这点记录,里面的内容是实习时师父教我的,可以说都是师父的干货,分享一点点。 linux的profile和bashrc文件通常被用来配置用户自己的个性化设置或者开发...
  • Python 脚本编写

    万次阅读 多人点赞 2018-07-14 19:50:05
    运行和修改 Python 脚本 与用户输入交互 处理异常 读写文件 导入本地、标准和第三方模块 在解释器中进行实验 安装 Python 检查计算机是否安装了 Python ? 在终端窗口输入如下指令,并按回车 python --...
  • Bat脚本编写以及cmd命令

    万次阅读 2017-12-27 10:08:26
    Bat脚本编写入门echo: 表示显示此命令后的字符 echo on: 表示在此语句后所有运行的命令都显示命令行本身 echo off: 表示在此语句后所有运行的命令都不显示命令行本身 @: 与echo off相像,但它是加在每个命令行的最...
  • shell脚本编写笔记

    千次阅读 2019-07-26 14:32:28
    本文主要介绍如何编写简单的shell脚本,给shell脚本传参,shell脚本获取当前运行时间,通过shell执行hql语句。
  • SecureCRT中Python脚本编写学习指南

    千次阅读 2018-01-13 17:00:09
    引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护;对于PE设备的测试维护人员来说使用较多是...接下来的时间我将对SecureCRT脚本编写的常用函数展开学习应用。 内容 (1)使用pytho
  • java+selenium自动化脚本编写

    千次阅读 2019-06-04 19:13:00
    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一、Selenium介绍 Selenium 主要用于Web 应用程序的...
  • 非常好的BASH脚本编写教程

    千次阅读 2017-08-04 22:04:28
    这里有个老American写的 BASH脚本编写教程,非常不错,至少没接触过BASH的也能看懂! 建立一个脚本  Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,288
精华内容 24,915
关键字:

脚本编写