Appium无线自动化实用教程

news2024/11/25 22:37:53

在这里插入图片描述

文章目录

  • 简介
    • 核心特点
    • 工作原理
    • 使用Appium进行自动化测试的一般步骤
  • 环境设置
  • 安装和启动Appium Server
    • 使用Node.js和npm安装Appium Server:
    • 启动Appium Server:
      • 命令行启动
      • 使用Appium Desktop安装和启动Appium Server:
      • 使用代码启动appium server
  • 编写测试代码
    • 测试工程的代码依赖
    • java测试代码
  • 扩展内容:WebDriver协议
    • WebDriver 协议主要特点:
    • WebDriver 协议基本元素:
    • WebDriver 协议工作流程:
  • 参考资料及文档
    • 官方资源
    • 学习资源和教程
    • YouTube上的Appium教程

简介

Appium是一个开源的、跨平台的自动化测试工具,用于自动化移动应用程序的测试。它支持iOS、Android和Windows应用的测试。Appium的目标是提供一个测试框架,允许测试者在不同的平台上使用相同的API执行自动化测试,从而实现“一次编写,到处运行”的测试脚本。

核心特点

开源与跨平台: Appium是完全开源的,并且支持iOS、Android和Windows平台,通过使用WebDriver协议提供了一种统一的接口来与这些平台进行交互。

支持多种编程语言: 由于遵循了WebDriver协议,Appium支持所有实现了WebDriver的客户端库的编程语言,包括Java、Python、Ruby、JavaScript (Node.js)、C#等。

本地应用、混合应用和网页应用的测试: Appium不仅可以用于原生应用的测试,而且还支持移动Web应用和混合应用(即应用内嵌有Web视图的应用)的自动化测试。

无需修改应用: 测试移动应用时,无需对应用进行任何修改或重新编译即可进行测试。

工作原理

Appium工作原理基于客户端-服务器架构。Appium服务器是核心,它接受来自客户端(即编写测试脚本的环境)的连接,并与移动设备或模拟器上的应用进行交互进行测试。
在这里插入图片描述

  1. 服务端-appium server: Appium本身作为一个服务器运行,该服务器实现了WebDriver和Mobile JSON Wire Protocol标准。它接收来自客户端的连接和命令,处理这些命令,并将其转换为适合目标平台(iOS、Android或Windows)的动作。

  2. 客户端: 客户端是使用支持WebDriver库的任何语言编写的测试脚本。测式人员通过编写测试脚本并将其发送到Appium服务器来执行测试动作。

  3. 移动设备/模拟器: 测试可以在真实设备、模拟器或者仿真器上执行。Appium转换命令并与设备上的应用交互。

使用Appium进行自动化测试的一般步骤

  1. 环境设置: 安装Appium服务器和客户端库,配置测试环境。

  2. 启动Appium服务: 通过命令行或Appium Desktop启动Appium服务。

  3. 编写测试脚本: 使用支持的编程语言编写自动化测试脚本,脚本中包含测试逻辑。

  4. 运行测试脚本: 测试脚本连接到Appium服务器并开始执行测试,Appium服务器将命令转换为具体的设备动作。

获取测试结果: 脚本执行完毕后,通过检测应用的状态或获取屏幕截图等方式来验证测试结果。

环境设置

无线自动化需要安装android sdk,可按照文档操作: Android SDK安装无脑操作文档

安装和启动Appium Server

使用Node.js和npm安装Appium Server:

  1. 安装Node.js:
    首先确保你已经安装了Node.js。你可以访问 Node.js 官方网站(https://nodejs.org/)并根据你的操作系统下载并安装相应版本的 Node.js。Node.js 的安装会包括 npm (Node package manager),它是用来管理 Node.js 包的工具。
    也可以安装nvm,然后由nvm来管理node的版本:
nvm list
v8.9.1
       v12.18.4
       v14.17.5
       v16.20.0
       v18.12.0
->     v18.16.0
       v18.17.1

我使用的是v18.16.0版本。

  1. 通过npm安装Appium:
    打开命令行或终端,然后使用以下命令安装Appium:
npm install -g appium

-g 选项是用来全局安装Appium,这样你就可以从命令行的任意位置启动它。

启动Appium Server:

Appium安装完成后,可以通过以下命令启动Appium Server:

命令行启动

appium

默认情况下,Appium Server在 0.0.0.0:4723 的主机和端口上监听连接。

会输出如下日志:

[Appium] Welcome to Appium v2.5.1 (REV 9600617c52d0d2e48493424c529ac6c945d2775b)
[Appium] The autodetected Appium home path: /Users/tester/.appium
[Appium] Attempting to load driver xcuitest...
[Appium] Attempting to load driver uiautomator2...
[Appium] Requiring driver at /Users/tester/.appium/node_modules/appium-uiautomator2-driver/build/index.js
[Appium] Requiring driver at /Users/tester/.appium/node_modules/appium-xcuitest-driver/build/index.js
reusing global emitter
[Appium] AndroidUiautomator2Driver has been successfully loaded in 3.464s
[Appium] XCUITestDriver has been successfully loaded in 3.465s
[Appium] Appium REST http interface listener started on http://0.0.0.0:4723
[Appium] You can provide the following URLs in your client code to connect to this server:
[Appium] 	http://127.0.0.1:4723/ (only accessible from the same host)
[Appium] 	http://192.168.1.34:4723/
[Appium] 	http://30.13.154.42:4723/
[Appium] Available drivers:
[Appium]   - xcuitest@4.26.0 (automationName 'XCUITest')
[Appium]   - uiautomator2@2.24.0 (automationName 'UiAutomator2')
[Appium] Available plugins:
[Appium]   - execute-driver@3.0.12
[Appium]   - images@2.0.10
[Appium]   - relaxed-caps@1.0.5
[Appium]   - universal-xml@1.0.8
[Appium]   - device-farm@7.3.0
[Appium]   - ocr@0.1.3
[Appium]   - appium-reporter-plugin@1.1.0-beta.01
[Appium] No plugins activated. Use the --use-plugins flag with names of plugins to activate

使用Appium Desktop安装和启动Appium Server:

Appium Desktop 是一个包含Appium Server和图形用户界面的应用程序,它可以让你更方便地启动、管理和监控Appium Server。如果你不想使用appium在命令行启动appium server,也可以使用Appium Desktop来启动server,以下是具体步骤:

  1. 下载Appium Desktop:
    访问Appium Desktop的发布页面(https://github.com/appium/appium-desktop/releases/),下载最新版本的Appium Desktop,适应于你的操作系统(Windows、macOS或Linux)。

  2. 安装Appium Desktop:
    下载完成后,根据你的操作系统进行安装。
    在Windows上,运行安装程序并按照指示完成安装。
    在macOS上,通常是将下载的 .dmg 文件拖动到 Applications 文件夹中。
    在Linux上,可能需要调整文件权限使得其可执行,并且根据发行版不同操作也有所不同。

  3. 启动Appium Desktop:
    打开Appium Desktop应用程序,并且点击"Start Server"按钮来启动Appium Server。你也可以指定不同的主机和端口以及其它高级设置。

  4. 连接到Appium Server:
    当Appium Server启动后,你可以通过Appium的客户端库连接到它,并运行你的自动化测试脚本。

无论使用命令行还是Appium Desktop,一旦Appium Server启动,你都需要确保已经设置好正确的环境,比如为Android测试正确地配置了ANDROID_HOME环境变量,为iOS测试安装了Xcode等,然后你就可以开始使用Appium进行自动化测试了。

使用代码启动appium server

appium java-client提供了一种可以使用代码启动appium server的方法:

AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
service.start();
try {
    // do stuff with drivers
} finally {
    service.stop();
}

查看AppiumDriverLocalService#start方法,本质上是另外启动了一个nodejs进程

public void start() throws AppiumServerHasNotBeenStartedLocallyException {
// 其他代码
    try {
                ExternalProcess.Builder processBuilder = ExternalProcess.builder().command(this.nodeJSExec.getCanonicalPath(), this.nodeJSArgs).copyOutputTo(this.stream);
                Map var10000 = this.nodeJSEnvironment;
                Objects.requireNonNull(processBuilder);
                var10000.forEach(processBuilder::environment);
                this.process = processBuilder.start();
            } catch (IOException var18) {
                throw new AppiumServerHasNotBeenStartedLocallyException(var18);
            }
            //其他代码
}

编写测试代码

我们还是先以java代码来编写测试代码

测试工程的代码依赖

        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>9.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-remote-driver</artifactId>
            <version>4.19.1</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>4.19.1</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-http</artifactId>
            <version>4.19.1</version>
        </dependency>

同时pom文件添加如下仓库配置

<repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

java测试代码

以下代码是一段对android手机进行滑动的代码片段:

package com.namedlock;

import com.namedlock.hsf.NamedThreadFactory;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.options.UiAutomator2Options;
import org.openqa.selenium.Dimension;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import static io.appium.java_client.touch.WaitOptions.waitOptions;
import static io.appium.java_client.touch.offset.PointOption.point;
import static java.time.Duration.ofMillis;

public class TestAppium {

    static private ExecutorService executorService = new ThreadPoolExecutor(100, 1000, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(100), new NamedThreadFactory("YunBeiDeviceExecutors"), new ThreadPoolExecutor.AbortPolicy());
    public static void main(String[] args) throws MalformedURLException {
        UiAutomator2Options options = new UiAutomator2Options()
                .setUdid("YJL4C18A22009669");
//                .setApp("/home/myapp.apk");
        AndroidDriver driver = new AndroidDriver(
                // The default URL in Appium 1 is http://127.0.0.1:4723/wd/hub
                new URL("http://127.0.0.1:4723"), options
        );

        long start = System.currentTimeMillis();
//        executorService.execute(() -> {
//            verticalSwipeByPercentages(driver, 0.6, 0.2, 0.5);
//        });
        verticalSwipeByPercentages(driver, 0.6, 0.3, 0.1);
        long last = System.currentTimeMillis();
        System.out.println("Time: " + (last - start) + "ms");

        verticalSwipeByPercentages(driver, 0.6, 0.3, 0.1);
        System.out.println("Time: " + (System.currentTimeMillis() - last) + "ms");

        last = System.currentTimeMillis();
        verticalSwipeByPercentages(driver, 0.6, 0.3, 0.1);
        System.out.println("Time: " + (System.currentTimeMillis() - last) + "ms");

        last = System.currentTimeMillis();
        verticalSwipeByPercentages(driver, 0.6, 0.3, 0.1);
        System.out.println("Time: " + (System.currentTimeMillis() - last) + "ms");
    }

    static public void verticalSwipeByPercentages(AndroidDriver driver, double startPercentage, double endPercentage, double anchorPercentage) {
        Dimension size = driver.manage().window().getSize();
        int anchor = (int) (size.width * anchorPercentage);
        int startPoint = (int) (size.height * startPercentage);
        int endPoint = (int) (size.height * endPercentage);
        new TouchAction(driver)
                .press(point(anchor, startPoint))
                .waitAction(waitOptions(ofMillis(100)))
                .moveTo(point(anchor, endPoint))
                .release().perform();
    }
}

扩展内容:WebDriver协议

WebDriver 协议是一个由 W3C (World Wide Web Consortium) 标准化的 Web 测试接口,它定义了浏览器或其他自动化测试工具中使用的一系列 HTTP 请求,这些工具可以通过这些 HTTP 请求来控制浏览器和查询其状态。最初由 Selenium 项目提出并开发,WebDriver 后来成为了 W3C 的一个正式推荐标准。

WebDriver 协议允许用户使用各种编程语言编写自动化测试脚本来模拟用户与网页的交云动,如点击按钮、填写表单、获取页面元素信息等。通过 WebDriver,可以自动执行这些模拟的用户动作,而且是在真实的浏览器环境中进行。

WebDriver 协议主要特点:

  1. 与浏览器无关:WebDriver 协议旨在对所有支持的浏览器提供一致的接口。

  2. 语言无关性:虽然 WebDriver 本身是一个HTTP RESTful API,但通过对应的客户端库(Selenium WebDriver),几乎所有流行的编程语言都可以与 WebDriver 协议进行交云动,包括 Java、Python、C#、Ruby、JavaScript 等。

  3. 支持多种浏览器驱动:为了支持各种主流浏览器(如 Chrome、Firefox、Safari 和 Edge),WebDriver 协议由各种浏览器的专有驱动来实现,例如 Chromedriver、Geckodriver、Safaridriver 和 Edgedriver。

WebDriver 协议基本元素:

  1. Session:一个测试会话的创建、管理和删除。一次自动化测试任务通常只有一个会话。
  2. Element:指在页面中可被云动化的对象(通常是 DOM 元素)。
  3. Commands:一系列动作,比如 ‘navigate to’, ‘click’, ‘sendKeys’。
  4. Capabilities:在启动浏览器会话时定义的所需的浏览器特性(如浏览器类型、版本和一些行为特性)。

WebDriver 协议工作流程:

  1. 客户端测试脚本调用 WebDriver 客户端库来创建一个新的浏览器会话,并且定义所需的浏览器特性。

  2. 客户端库将这个请求作为 HTTP POST 请求发送到 WebDriver server (对应的浏览器驱动)。

  3. WebDriver server 接收并处理请求,创建一个新的浏览器实例,该实例的特性符合请求中的 capabilities,并且将 session id 返回给客户端。

  4. 客户端使用 session id 将后续的命令发送到 WebDriver server,比如导航到一个 URL 或者点击页面上的元素。

  5. WebDriver server 转译客户端发送的命令,将其转化成浏览器能够理解并执行的动作。

  6. 浏览器执行这些动作后,WebDriver server 会将结果返回给客户端。

  7. 测试结束时,客户端会发送一个请求关闭会话,WebDriver server 会关闭浏览器实例并释放资源。

WebDriver 的在不同编程语言的实现被称为“绑定(bindings)”,而这些绑定与 WebDriver 协议进行交云动,使得写出的自动化脚本不用担心具体细节,可以直接向 WebDriver server 发送命令。这种设计使 WebDriver 协议成为了自动化 Web 测试领域的事实标准,被广大测试工程师接受和采用。

参考资料及文档

Appium是一个非常流行的移动自动化测试框架,如果您希望深入学习Appium或仅仅是希望了解关于它的更多信息,以下是一些非常有用的资源和文档:

官方资源

  1. Appium官网: http://appium.io/
    Appium的官方网站提供最基本的介绍、安装指南以及官方的文档链接。
  2. Appium文档: https://appium.io/docs/en/about-appium/intro/
    这里是Appium官方的文档,涵盖了从基本的安装、设置到高级主题如平台特定的配置等。
  3. Appium GitHub存储库: https://github.com/appium/appium
    在GitHub上,您找到Appium的源代码,以及关于正在开发的功能、bug修复和版本发布信息。

学习资源和教程

  1. Test Automation University - Appium课程(https://testautomationu.applitools.com/appium-tutorial/)
    提供免费的Appium课程,从基础知识到进阶使用都有详细介绍。
  2. Appium Pro(https://appiumpro.com)
    由Appium的一些核心贡献者运行,提供了一系列的专业文章和技巧。
    视频教程

YouTube上的Appium教程

YouTube 上有许多关于Appium的免费视频教程,涵盖不同的主题和难易程度。
社区和支持
6. Appium讨论论坛: https://discuss.appium.io/
Appium的官方社区,可以提问、分享经验和跟进最新的Appium动态。
7. Stack Overflow
使用appium标签的问题和回答区,您可以在这里提出具体的问题,或者帮助他人解答。

不同资源有不同的侧重点,在开始学习Appium的旅程时,建议多方位尝试,找到最适合自己学习方式的资源。随着对Appium的更深入了解,参与社区讨论和贡献也是提升技能的好方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵的组合

重构 将原始矩阵,重构形状 例如,下图中,将AB重构为一个新的矩阵,CD重构为一个新的矩阵,EF重构为一个新的矩阵,GH重构为一个新的矩阵。 MATLAB实现 clc; clearvars; close all;X1=1:64; X1=reshape(X1,8,8)

基于YOLOv8/YOLOv5的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本篇博客呈现了一种基于深度学习的人脸表情识别系统&#xff0c;并详细展示了其实现代码。系统采纳了领先的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了比较&#xff0c;展示了其在图像、视频、实时视频流及批量文件中识别人脸表情的高准确度。文章深入…

PostgreSql 01 安装,创建用户,创建数据库,创建关系

01.安装postgresql postgreSql 是在linux上 去官网找按照的方式 选择好postgreSql 的版本&#xff0c;已经Linux的发行版本 拿到命令&#xff0c;直接扔到Linux中运行即可 # 下载PGSQL的rpm包 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

【核心复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略

目录 主要内容 内容详情 1.问题引出 2.可控负荷 3.网络拓扑约束 4.算法流程 结果一览 1.原文结果 2.程序运行结果 下载链接 主要内容 该模型复现文章《同时考虑考虑孤岛与重构的配电网故障恢复运行策略》&#xff0c;以IEEE33配电网为分析对象&#xff0c;…

Flutter应用在苹果商店上架前的准备工作与注意事项

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

智能电表如何在新能源发电领域发挥作用

智能电表具备自动计量计费和数据传输功能&#xff0c;这使其成为配用电管理的核心设备。在新能源发电领域&#xff0c;智能电表能够实时监测和计量新能源发电设备的发电量&#xff0c;确保电能的质量和安全。同时&#xff0c;通过数据传输功能&#xff0c;智能电表可以将新能源…

[云呐]固定资产盘点报告哪个部门写

固定资产盘点报告通常由哪个部门来完成和签发呢?总体来说,固定资产盘点报告主要由资产管理部门或核算部门具体组织拟定并与财务部门共同签发。个别重大报告还需要上级领导或委员会研讨通过。  资产管理部门:  资产管理部门是直接负责公司固定资产管理工作的核心部门,它主导…

网络钓鱼升级 Darcula如何窃取用户信息

近日&#xff0c;网络安全领域一种名为 “Darcula” 的网络钓鱼欺诈&#xff08;PhaaS&#xff09;悄然兴起。这种新型钓鱼方式不同于传统的手段&#xff0c;它巧妙地利用了谷歌信息和 iMessage 的富通信服务&#xff08;RCS&#xff09;&#xff0c;成为了网络犯罪分子的新手段…

分享一种快速移植OpenHarmony Linux内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

一、单层感知器(MCP人工神经元模型)

目录 前言 由来 介绍 算法原理 假设前提 一、前向传递过程&#xff08;算法训练好后的使用过程&#xff09; 补充&#xff1a;sign函数 二、训练方法&#xff08;求解权重w、偏转量b&#xff09; 写出损失函数 误分点选取 损失函数求导 梯度下降自确定w、b 算法…

救砖刷机------MTK芯片类线刷 救砖 常规线刷不开机 MTK分区表修复【二】

救砖刷机------MTK芯片类线刷 救砖 免授权的一些操作步骤与工具解析【一】 在上期的博文中解析了mtk刷机平台的一些基本选项说明和授权刷写的一些常识。这期将着重说明下mtk机型分区表损坏如何解决。 众所周知。高通分区表在高通线刷包中显而易见,在常规9008刷写中你会正常刷…

主流公链 - Fantom

Fantom&#xff1a;高性能的区块链协议 Fantom是一种开创性的区块链协议&#xff0c;旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议&#xff1a;Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错&#xff08;ABFT&#xff09;共…

基于springboot+vue+Mysql的火车订票管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

TikTok账号封号原因是什么?全面攻略

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…

掼蛋技巧秘籍

1、开始出牌不走牌一定是在理顺子。 2、起手出顺&#xff0c;后面一定还有两三把顺子。 3、上中场就出同花顺就一定还有大炸。 4、双贡顺子、对子是优势&#xff0c;绝对不能放。 5、单贡返牌&#xff0c;给对友单张小牌&#xff08;5以下&#xff09;&#xff0c;给对手大…

vue3中播放flv流视频,以及组件封装超全

实现以上功能的播放&#xff0c;只需要传入一个流的地址即可&#xff0c;当然组件也只有简单的实时播放功能 下面直接上组件 里面的flvjs通过npm i flv.js直接下载 <template><div class"player" style"position: relative;"><p style&…

站群CMS系统

站群CMS系统是一种用于批量建立和管理网站的内容管理系统&#xff0c;它能够帮助用户快速创建大量的网站&#xff0c;并实现对这些网站的集中管理。以下是三个在使用广泛的站群CMS系统&#xff0c;它们各具特色&#xff0c;可以满足不同用户的需求。 1. Z-BlogPHP Z-BlogPHP是…

云计算HCIE学员分享丨授人以鱼不如授人以渔

我还记得大一时&#xff0c;我对是否要报名云计算IE有着很多犹豫。当时&#xff0c;我对这个领域充满了好奇&#xff0c;但同时也担心自己是否有能力应对这样的挑战。正是在这个时候&#xff0c;我有幸认识了誉天培训机构的老师们。 我第一次接触誉天&#xff0c;就被那里的师资…

数据结构二叉树顺序存储——堆

堆 1.堆的概念2.堆的实现 &#xff08;建小堆为例&#xff09;2.1 初始化和销毁2.2 判空2.3 获得堆顶元素和堆的大小2.4 插入2.5 删除 3.堆的构建&#xff08;建小堆为例&#xff09; 1.堆的概念 将若干数据或元素按照完全二叉树的存储方式顺序存储到一个一维数组中&#xff0…

jupyter加目录contrib nbextension 使用

jupyter在工作中使用很方便&#xff0c;可是一旦单个文件的内容多了&#xff0c;即使有markdown文本提醒&#xff0c;上下翻找依旧很费精力。这时&#xff0c;有个目录就显得至关重要了。 1 安装模块 打开anaconda的PowerShell&#xff08;带有Prompt的&#xff09;&#xff0…