# @applitools/eyes-universal 中文文档

规范地址：https://npmcn.com/package/%40applitools/eyes-universal/

版本：2\.18\.0
npm 元数据更新时间：2026-06-28T14:42:03.939Z
中文译文更新时间：2026-11-06T16:47:34.907Z
软件包许可：SEE LICENSE IN LICENSE

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40applitools/eyes-universal
原文对照：https://npmcn.com/package/%40applitools/eyes-universal/?lang=original
项目主页：https://applitools.com/
源码仓库：https://github.com/applitools/eyes.sdk.javascript1

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：147 kB，21 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- Node.js 要求：\>=12\.13\.0
- 运行依赖：10 个
- 首次发布：2021-06-01T14:00:27.654Z
- 最新版本发布：2022-12-27T15:29:46.169Z
- 近 30 天下载量：2710（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：137（近 12 个月 0 个）

## 中文简介

Applitools 双眼通用 SDK

## 安装

```sh
npm install @applitools/eyes-universal
```

也可以使用：`pnpm add @applitools/eyes-universal`、`yarn add @applitools/eyes-universal`、`bun add @applitools/eyes-universal`

## README

# 环球眼

![Applitools Eyes](https://i.ibb.co/3hWJK68/applitools-eyes-logo.png)

[![npm](https://img.shields.io/npm/v/@applitools/eyes-universal?color=%2302afc2&label=npm&logo=npm)](https://www.npmjs.com/package/@applitools/eyes-universal) [![GitHub release (latest by date)](https://img.shields.io/badge/binaries-download-%2302afc2?logo=github)](https://github.com/applitools/eyes.sdk.javascript1/releases)

-   [环球眼](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyes-universal)
    -   [导言](https://npmcn.com/package/%40applitools/eyes-universal/#readme-introduction)
    -   [网络安全套](https://npmcn.com/package/%40applitools/eyes-universal/#readme-websocket)
        -   [通用 SDK 通讯协议](https://npmcn.com/package/%40applitools/eyes-universal/#readme-universal-sdk-messaging-protocol)
            -   [请求格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-request-format)
            -   [答复格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-response-format)
            -   [事件格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-event-format)
        -   [客户发起的活动](https://npmcn.com/package/%40applitools/eyes-universal/#readme-client-initiated-events)
            -   [会议.init](https://npmcn.com/package/%40applitools/eyes-universal/#readme-sessioninit)
        -   [客户端启动的命令](https://npmcn.com/package/%40applitools/eyes-universal/#readme-client-initiated-commands)
            -   [Core. make Manager (管理者)](https://npmcn.com/package/%40applitools/eyes-universal/#readme-coremakemanager)
            -   [眼睛管理者,打开眼睛](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesmanageropeneyes)
            -   [眼睛管理者,关闭管理者](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesmanagerclosemanager)
            -   [眼睛 检查](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyescheck)
            -   [双眼 分地](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyeslocate)
            -   [眼睛。 摘录](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesextracttextregions)
            -   [眼睛。 摘录图文](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesextracttext)
            -   [双眼相近](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesclose)
            -   [双眼. .](https://npmcn.com/package/%40applitools/eyes-universal/#readme-eyesabort)
            -   [核心. get ViewportSize 软件](https://npmcn.com/package/%40applitools/eyes-universal/#readme-coregetviewportsize)
            -   [核心. set 维尤波特Size](https://npmcn.com/package/%40applitools/eyes-universal/#readme-coresetviewportsize)
            -   [Core. close Batches (英语)](https://npmcn.com/package/%40applitools/eyes-universal/#readme-coreclosebatches)
            -   [Core.delete 测试](https://npmcn.com/package/%40applitools/eyes-universal/#readme-coredeletetest)
        -   [服务器启动的命令](https://npmcn.com/package/%40applitools/eyes-universal/#readme-server-initiated-commands)
    -   [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-specdriver)
        -   [工具命令](https://npmcn.com/package/%40applitools/eyes-universal/#readme-utility-commands)
            -   [`isDriver`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-isdriver)
            -   [`isElement`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-iselement)
            -   [`isSelector`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-isselector)
            -   [`transformDriver`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-transformdriver)
            -   [`transformElement`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-transformelement)
            -   [`extractSelector`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-extractselector)
            -   [`isStaleElementError`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-isstaleelementerror)
            -   [`isEqualElements`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-isequalelements)
        -   [核心命令](https://npmcn.com/package/%40applitools/eyes-universal/#readme-core-commands)
            -   [`mainContext`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-maincontext)
            -   [`parentContext`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-parentcontext)
            -   [`childContext`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-childcontext)
            -   [`executeScript`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-executescript)
            -   [`findElement`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-findelement)
            -   [`findElements`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-findelements)
            -   [`getDriverInfo`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-getdriverinfo)
            -   [`getOrientation`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-getorientation)
            -   [`getTitle`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-gettitle)
            -   [`getUrl`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-geturl)
            -   [`takeScreenshot`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-takescreenshot)
            -   [`getElementRect`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-getelementrect)
            -   [`setWindowSize`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-setwindowsize)
            -   [`getWindowSize`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-getwindowsize)
            -   [`setViewportSize`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-setviewportsize)
            -   [`getViewportSize`](https://npmcn.com/package/%40applitools/eyes-universal/#readme-getviewportsize)
    -   [参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-refer)
        -   [参考存储](https://npmcn.com/package/%40applitools/eyes-universal/#readme-refer-storage)
        -   [参考格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-reference-format)
        -   [参考使用](https://npmcn.com/package/%40applitools/eyes-universal/#readme-reference-usage)
    -   [API 密码](https://npmcn.com/package/%40applitools/eyes-universal/#readme-api)

## 导言

A. 客户执行的主要目的_客户端_)是对JavaScript(JavaScript)中执行的功能核心提供语言绑定_服务器_) (中文(简体) ). _服务器_ 控制一切,和 _客户端_ 不需要知道 如何工作.

给 _客户端_ 能够与 _服务器_ 它必须执行 [WebSocket 客户端](https://npmcn.com/package/%40applitools/eyes-universal/#readme-WebSocket) 通讯层。 通过 WebSocket 频道 _客户端_ 可将命令发送到 _服务器_ 同时执行任何行动 _服务器_ 将命令发送给 _客户端_ 以便实现环境自动化. _客户端_ 必须执行一套命令([光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver)),并在 _服务器_ 会要求它。 由于执行任何命令都要求知道上下文,这个命令应该在其中执行, _客户端_ 应当通过一些上下文提及 _服务器_解决这一问题 _客户端_ 必须执行 [参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Refer) 机制。 参考应帮助 _客户端_ 将非序列数据发送到服务器,当从服务器收到此数据时,将很容易将其解回原非序列数据对象.

在使用基于WebDrive的 _客户端_(a) 执行[光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver)可以避免,也可以避免 [参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Refer) 执行。 这种简化可以通过提供有关WebDriver自动化会话而不是驱动程序的信息来实现,还需要提供元素ID而不是元素. 由于所有非串行式对象被可串行式数据对象所取代,因此需要在 [参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Refer) 被删除.

客户实施的最大部分是实际的用户化 [API 层](https://npmcn.com/package/%40applitools/eyes-universal/#readme-API),它不应包含任何特定的逻辑,而只执行一些输入数据验证,收集和处理,然后将这些数据发送到服务器. API层不应对它应该使用的自动化框架有任何约束性,它会有助于对不同的框架再使用API层.

## 网络安全套

通用 sdk 的客户端-服务器架构需要执行介于 _客户端_ 编辑 _服务器_由于主要需要双向通信,因此选择了WebSocket协议。 WebSocket协议只使用消息操作,每个消息都是独立的数据块. 协议不支持在消息上获得响应. 这就是为什么通信格式是由专有的请求-答复通讯接口决定的(_通用 SDK 通讯协议_),这需要客户端-服务器消息的特定格式.

所有命令都应作为请求处理,这意味着在收到请求后始终必须发出答复。 但简单的事件也是允许的 _通用 SDK 通讯协议_,这意味着 _客户端_,以及 _服务器_,可以发送一个不需要任何响应的信息.

参考执行情况: [联合来文的执行](https://github.com/applitools/eyes.sdk.javascript1/blob/1a54c6b3f28b25b41a708f5b600ceabbf8fc9db6/packages/eyes-universal/src/socket.js), (中文(简体) ), [Ruby 执行](https://github.com/applitools/eyes.sdk.javascript1/blob/poc/universal-ruby-sdk/rb/eyes-selenium/lib/applitools/socket.rb)

## 运行通用服务器

客户端想要生成通用服务器并与它通信,应当知道服务器正在听取收到的WebSocket请求的端口. 了解端口的方法是将输出的一行消耗到服务器的 `stdout` 流线。 此行将是用于 `ws://localhost:{port}/eyes`,例如如果此行是 `21077`,然后连接到服务器的 URL 是 `ws://localhost:21077/eyes`。 。 。 .

当启动服务器时,可能会出现冲突情况——通用服务器可能已经在所期望的端口运行. 当这种情况发生时,通用服务器会尝试一个“手摇”程序,其进程会监听 `port`。如果有另一个通用服务器 **编号** 在港口听,和 `singleton` 指定(这是默认值,见 [CLI 参数](https://npmcn.com/package/%40applitools/eyes-universal/#readme-cli-arguments) 然后通用服务器进程将写入 `port` 然后关闭自己. **对客户来说,这是无缝的** - 客户端没有办法知道它产生的过程 是否确实是这个端口的相同过程.

如果握手失败,意味着没有通用服务器,或者它是不同版本的通用服务器,那么行为就被定义为: `lazy` 参数。 默认, `lazy` 实值 `true` 这意味着服务器会尝试找到一个免费的端口来收听. 若为 `lazy` 实值 `false`,然后服务器进程将以非零代码退出.

### CLI 参数

```
$ ./universal-server-linux --help

Options:
      --help          Show help                                        [boolean]
      --version       Show version number                              [boolean]
  -p, --port          run server on a specific port.   [number] [default: 21077]
  -s, --singleton     runs server on a singleton mode. It will prevent the
                      server to start in case the same server is already
                      started.                         [boolean] [default: true]
  -l, --lazy          runs server on a lazy mode. It will not try to find a free
                      port if the required one is already taken.
                                                      [boolean] [default: false]
      --idle-timeout  time in minutes for server to stay responsible in case of
                      idle.                               [number] [default: 15]
      --config        json string to use instead of cli arguments       [string]
      --eg            launch the execution grid client[boolean] [default: false]

```

### 通用 SDK 通讯协议

协议描述了不同类型电文的格式,例如: [请求](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Request-format), (中文(简体) ), [回应](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Response-format),以及 [活动](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Event-format)。每条消息应被格式化为 JSON 字符串.

> **`IDEA`** 也许支持UBJSON这样的东西也是有道理的,也许有助于发送截图 _客户端_ 而不转换到基数64字符串,这显然是一种间接费用.

两个客户端的服务器都使用自己的非序列对象进行操作,这些非序列对象必须以某种方式通过WebSocket发送. 在客户端上,非串行性对象是驱动器,元素,也可能是选择器,同时服务器以跑道和眼睛抽象操作. 协议描述了通过单独的模块来表示不可序列对象(对于客户端和服务器)的通用方法 [参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Refer) 带有严格的批示和参考格式.

#### 请求格式

```ts
{
  name: string, // could be any string, but recommended format is "<Domain>.<requestName>" (e.g. "Driver.executeScript")
  key: string, // could be any random string, this value will be used to associate response with actual request.
  payload?: any // any input data
}
```

#### 答复格式

```ts
{
  name: string, // name of the request this response sent for
  key: string, // key value received in request
  payload: {
    result?: any, // result of the request if it was finished successfully
    error?: { // error object if exception was thrown during action processing
      message: string // error massage
      stack: string // error stack trace
    }
  }
}
```

#### 事件格式

```ts
{
  name: string, // could be any string, but recommended format is "<Domain>.<eventName>"
  payload?: any // any event data
}
```

### 客户发起的活动

为了把一些数据传递给 _服务器_ 并让 _服务器_ 自行处理 _客户端_ 能够发送轻量级事件( e)[事件格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Event-format))),不会以任何方式回应.

#### 会议.init

此事件必须在连接到 _客户端_ 财务报告和审定财务报表 _服务器_ 将成立. _客户端_ 应以一种格式发送关于其自身的重要元数据:

```ts
{
  name: string, // name of the client sdk
  version: string, // version of the client sdk
  commands?: string[], // array of command names that could be processed by the client sdk
  protocol?: 'webdriver' // the name of the prebuilt server-side spec driver
}
```

### 客户端启动的命令

为了执行任何行动 _客户端_ 需要向您发出适当的请求 _服务器_ 以特定格式([请求格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Request-format))并在此描述的格式等待回复([答复格式](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Response-format)) (中文(简体) ).

#### Core. make Manager (管理者)

应当发送此请求以创建管理器对象 。 它期望输入类型 [眼睛管理器配置](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L19)。 。 。 .

作为回应,客户应期望获得管理人员的参考([管理器参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format)),该参考文献必须被使用,以便执行与管理人员有关的行动(e[眼睛管理者,打开眼睛](https://npmcn.com/package/%40applitools/eyes-universal/#readme-EyesManager.openEyes), (中文(简体) ), [眼睛管理者,关闭管理者](https://npmcn.com/package/%40applitools/eyes-universal/#readme-EyesManager.closeManager)(中文(简体) )

> 当命令被发送时 `EyesManager` 当实际的视物必须打开时,它会懒散地发送。 注意,在这个架构中,眼睛只能从管理者实例中被创造出来,而眼睛的创造和开口被组合在一个单一的操作中.

#### 眼睛管理者,打开眼睛

此命令必须用来创建眼睛对象. 它期望与相关 [管理器参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format) (从) [Core. make Manager (管理者)](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Core.makeManager), (中文(简体) ), [驱动参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format),以及 [眼睛连接](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L25) 格式为:

```ts
{
  manager: ManagerRef, // reference received from "Core.makeManager" command
  driver: DriverRef, // reference to the driver that will be used by the server in order to perform automation
  config?: EyesConfig // configuration object that will be associated with a new eyes object, it could be overridden later
}
```

作为回应,客户端应期望获得目视参考([双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format)在与眼睛有关的请求中必须使用这一参考([眼睛 检查](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.check), (中文(简体) ), [双眼 分地](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.locate), (中文(简体) ), [眼睛。 摘录](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.extractTextRegions) , (中文(简体) ), [眼睛。 摘录图文](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.extractText), (中文(简体) ), [双眼相近](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.close), (中文(简体) ), [双眼. .](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Eyes.abort) (中文(简体) )

#### 眼睛管理者,关闭管理者

这个命令的用意是用来关闭所有用这个跑者所创造出的眼睛对象,中止未关闭的测试,并返回一个带有结果的总结,以及每个眼睛对象的例外. 它期望输入一个相关的 [管理器参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format) (从) [Core. make Manager (管理者)](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Core.makeManager) (单位:千美元) `throwErr` 属性 :

```ts
{
  manager: ManagerRef
  throwErr: boolean
}
```

在响应时,客户端会收到形状的汇总对象 [测试结果摘要](https://github.com/applitools/eyes.sdk.javascript1/blob/1221f4e36ca2fbf5f49dfee5d32504c6bc574c9b/packages/types/src/data.ts#L285)

如果 `throwErr` 实值 `true`。以下 JavaScript 片段显示如何处理这种错误 :

```
catch (err) {

  // if it's some internal error that is not mapped to a known state - throw it to the user
  if (!err.info?.testResult) {
    throw err
  }

  // wrap the testResult in the error with a data class 
  const testResult = new TestResultsData(err.info.testResult, deleteTest)

  // throw the right instance of error based on the reason
  if (err.reason === 'test failed') {
    throw new TestFailedError(err.message, testResult)
  } else if (err.reason === 'test different') {
    throw new DiffsFoundError(err.message, testResult)
  } else if (err.reason === 'test new') {
    throw new NewTestError(err.message, testResult)
  }
}
```

#### 眼睛 检查

此命令用于执行检查/匹配动作 。 它期望输入相关的 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format), (中文(简体) ), [检查设置](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L66),以及 [眼睛连接](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L25) 格式为:

```ts
{
  eyes: EyesRef,
  settings?: CheckSettings,
  config?: EyesConfig
}
```

如果成功,客户将收到答复 [匹配结果](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L200) 对象.

#### 双眼 分地

此命令用于执行定位动作 。 它期望输入相关的 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format), (中文(简体) ), [地点](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L92),以及 [眼睛连接](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L25) 格式为:

```ts
{
  eyes: EyesRef,
  settings: LocateSettings,
  config?: EyesConfig
}
```

如果成功,客户端会收到一个回复,其对象是定位器名称,通过 [地点](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L92),与 [地区](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L59)对.

```ts
{
  [key: string]: Region
}
```

#### 眼睛。 摘录

此命令必须用于从页面中取出文本区域 。 它期望输入相关的 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format), (中文(简体) ), [OCRSearch 安排](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L85),以及 [眼睛连接](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L25) 格式为:

```ts
{
  eyes: EyesRef,
  settings: OCRSearchSettings,
  config?: EyesConfig
}
```

在成功的情况下,客户端会收到一个对象的回复,该对象的规律会传入 [OCRSearch 安排](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L85),与以下数组相关: [文本区域](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L61)对.

```ts
{
  [key: string]: TextRegion[]
}
```

#### 眼睛。 摘录图文

此命令必须用于从页面中取出文本区域 。 它期望输入相关的 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format)数组 [OCR 实例安排](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L78)'的,和 [眼睛连接](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/config.ts#L25) 格式为:

```ts
{
  eyes: EyesRef,
  regions: OCRExtractSettings[],
  config?: EyesConfig
}
```

在成功的情况下,客户端会收到带有数组字符串的响应.

#### 双眼相近

这个命令必须用来关闭眼睛物体并完成测试. 它不会期望任何输入 除了关联 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format)。 。 。 .

```ts
{
  eyes: EyesRef
}
```

如果成功,客户将收到答复 [测试结果](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L205) 对象.

> 由于测试结果状态, 此命令永远不会丢出错误 。 这一功能应在客户端实施.

#### 双眼. .

此命令必须用于中止眼睛对象 。 它不会期望任何输入 除了关联 [双眼参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format)。 。 。 .

```ts
{
  eyes: EyesRef
}
```

如果成功,客户将收到答复 [测试结果](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L205) 对象.

#### 核心. get ViewportSize 软件

此命令必须用于获取给定驱动程序当前的视图端口大小 。 它期望输入为 [驱动参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format) 格式为:

```ts
{
  driver: DriverRef
}
```

如果成功,客户将收到答复 [大小](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L54) 对象.

> WD协议没有api来提取浏览器窗口的取景器大小,然而Apium有这个api以及CDP. 所以即使通过服务器获取这些信息没有多大意义, 最好用这种方式让服务器了解这些数据.

#### 核心. set 维尤波特Size

此命令必须用来设定当前给定驱动程序将桌面浏览器窗口自动化的视图大小 。 如果此命令会被执行到不支持视图调整大小错误的驱动程序上, 将会被丢弃 。 如果无法将视图大小调整到所需的大小, 也会出错 。 命令预计输入方式 [驱动参考](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Reference-format) 财务报告和审定财务报表 [大小](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/data.ts#L54) 格式为:

```ts
{
  driver: DriverRef,
  size: Size
}
```

#### Core. close Batches (英语)

此命令必须用其ID关闭批次. 它期望输入类型 [关闭Batches 设置](https://github.com/applitools/eyes.sdk.javascript1/blob/0eec1b760d07489f62d95b9441d0ee5c560c24a1/packages/types/src/setting.ts#L97)

#### Core.delete 测试

这个命令必须用来关闭从眼睛仪表板上删除的测试结果.

### 服务器启动的命令

_服务器_ 需要向 _客户端_ 以便使用驱动程序 api 实现自动化。 将通过特殊接口(a.k.a.)进行. [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver))摘要列出任何框架细节。 请求哪些 _服务器_ 只能用一组 [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver) 命令.

自兹 [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver) 有一些命令相互矛盾, _服务器_ 应该知道它可以发送到 _客户端_,该信息应当通过 [会议.init](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Session.init) 活动.

每个 [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver) 命令将作为请求收到 `"Driver.<commandName>"`,例如调用 [查找元素](https://npmcn.com/package/%40applitools/eyes-universal/#readme-findElement) 命令 _服务器_ 将发送 `"Driver.findElement"` 请求 _客户端_。这些论点 [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver) 命令会以有效载荷发送,作为键与参数名称相同的对象,例如调用 [查找元素](https://npmcn.com/package/%40applitools/eyes-universal/#readme-findElement) 命令 _服务器_ 将发送带有密钥的有效载荷 `driver` 财务报告和审定财务报表 `selector`。结果 [光谱驱动器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-SpecDriver) 命令必须由 _客户端_ 作为回应信息中的有效载荷.

## 光谱驱动器

光谱驱动程序(Spec driver)是一组简单的函数,每个函数通过调用框架(如硒)API来进行自动化. 我们需要我们代码与一个实际驱动器之间的接口来抽象出框架的api.

下面是一份清单,其中描述了可在光谱驱动程序中执行的每一种方法,但执行的必要性取决于框架.

### 工具命令

#### `isDriver`

此命令接受驱动程序实例作为参数, 应当返回 `true` 如果这是有效的驱动实例, 否则 `false`。 。 。 .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L32)

#### `isElement`

此命令接受元素为参数并应当返回 `true` 如果这是一个有效的元素, 否则 `false`。 。 。 .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L36), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L6)

#### `isSelector`

此命令接受选择器为参数并返回 `true` 如果这是有效的选择器, 否则 `false`。有效选择者应是三种格式之一:

1.  框架支持的(例如:. `By.css('html')` (单位:千美元)
2.  JSON 有属性的对象 `type` 有数值 `"css"` 或者说 `"xpath"` 财务报告和审定财务报表 `selector` 带有字符串值.
3.  简单字符串,如果框架本身不处理字符串,那么该字符串就应当作为cs选择器处理.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L38)

#### `transformDriver`

此命令只用于驱动程序一次,以便在给定驱动程序实例中进行一些修改甚至替换. 如果在开始与驱动程序合作之前需要一些额外的配置,可能有所帮助。 如果在每次从它返回时都会使用这种方法,而不是驱动程序.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L47)

#### `transformElement`

此命令用于在使用元素前转换元素( 如 : `executeScript` 参数)。 它接受一个必须作为元素对待的值,但框架本身无法单独处理这个值. 有些框架可能支持不止一种要素格式,这些格式在使用上可能并不相同.

> 如何理解你应该改变什么格式? 要正确了解哪种格式优于其他格式, 您应该检查哪个格式最有效 [执行脚本](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##executeScript) 财务报告和审定财务报表 [子文件夹](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##childContext)。 。 。 .

参考: [TS WDIO 软件](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-webdriverio-5/src/spec-driver.ts#L100)

#### `extractSelector`

此命令用于从元素对象中提取选择器。 并非所有框架都保留关于用于查找元素的筛选器的信息,但如果它有助于处理一些带有 stale 元素错误的边缘大小写.

参考: [TS WDIO 软件](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-webdriverio-5/src/spec-driver.ts#L104)

#### `isStaleElementError`

此命令用于理解一个错误是 stale 元素错误, 它接受一个错误对象并应当返回 `true` 如果错误是由于元素引用被 stale.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L55)

#### `isEqualElements`

如果两个元素对象在网页上(或在本地应用程序中)引用同一元素,则使用此命令来理解是否返回 `true` 如果元素是一样的.

> **`WD!`** 可以用其识别码来比较要素,因为根据协议规格,识别码在所有框架都应是独一无二的,同一要素也应是相同的,但并非所有WD执行都保持这一规则(例如iOS Safari)。 在这种情况下,可以通过执行一个脚本与那些可以比较的元素来将元素在浏览器中进行比较,如果抛出一个陈旧元素出错,则元素显然并不等同.

参考: [TS WDIO 软件](https://github.com/applitools/eyes.sdk.javascript1/blob/eyes-api/packages/eyes-webdriverio-5/src/spec-driver.ts#L112)

### 核心命令

本节中的每个命令都接受驱动程序/文本作为第一个参数.

#### `mainContext`

此命令用于从当前/赋予的框架获取主/上级框架的访问.

> **`WD!`** 此命令必须将驱动程序当前框架更改为最上方框架,而不一定返回驱动程序.

> **`CDP!`** 这个命令必须从给定的框架中返回最上层(没有父的)框架.

参考文献: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L78), (中文(简体) ), [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L67), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L21)

#### `parentContext`

此命令用于访问当前/给定的框架的父框架 .

> **`WD!`** 此命令必须将驱动程序当前框架更改为当前框架的父框架,而不一定返回驱动程序. 一些框架(如硒3,wdio 4)的后遗症实施没有这个功能的专用api,在此情况下,执行动作的唯一途径是自己向终点发送请求(英语:Selenium 3, wdio 4)[WD 光谱](https://www.w3.org/TR/webdriver/#switch-to-parent-frame)) (中文(简体) ).

> **`CDP!`** 此命令必须返回给定框架的父框架( 上一个等级) .

参考文献: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L82), (中文(简体) ), [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L75), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L25)

#### `childContext`

此命令用于访问当前/ 给定框架的子框架 **元素** 指目标iframe.

> **`WD!`** 此命令必须使用给定的元素将驱动程序当前框架更改为子框架,而不一定要返回驱动程序 .

> **`CDP!`** 这个命令必须返回给定元素的内容框架,在参数中仍然提供父框架,但协议不需要使用.

参考文献: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L91), (中文(简体) ), [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L79), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L29)

#### `executeScript`

此命令在特定上下文中执行特定类型字符串的脚本.

> **`CDP!`** 协议无法执行不是函数声明的脚本,这意味着仅仅是函数正文或JS表达式不是有效的脚本,例如: `return document. title`,必须转换为 `function(){ return document.title }`。 。 。 .

参考文献: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L71), (中文(简体) ), [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L62), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L14)

#### `findElement`

此命令在特定上下文中由给定选择器查找元素 。 如果一个元素不存在, `null` 应返回( e)**不丢**) (中文(简体) ). 见 [选择器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##isSelector) 命令用于选择格式.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L95), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L33)

#### `findElements`

此命令在特定上下文中通过给定选择器查找多个元素 。 如果没有元素存在,则需要一个空阵列(`[]`应还. 见 [选择器](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##isSelector) 命令用于选择格式.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L103), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L37)

#### `getDriverInfo`

此命令用于从一开始提取驱动程序和环境的信息. 记住,并非所有财产都是必要的.

这是JSON对象的一个计划 这种方法应该返回.

```ts
{
  sessionId?: string, // aut session id
  isMobile?: boolean, // true if the environment is a mobile device (e.g. os is android or ios), this doesn't necessarily mean a native app is tested
  isNative?: boolean, // true if the environment is a native app (so no browser)
  deviceName?: string, // device name
  platformName?: string, // os name
  platformVersion?: string, // os version
  browserName?: string, // browser name
  browserVersion?: string, //browser version
}
```

> 事实上,如果你的框架不支持本地应用程序自动化,整个方法可以跳过,在这种情况下,数据将从用户代理中提取,但如果可能,更好执行. 所有信息都包含在驱动程序的能力中. 今后,我们不妨在此提供更多的信息.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L155)

#### `getOrientation`

如果框架不支持本地应用程序自动化,则不需要此命令. 此命令应返回 `"landscape"` 或者说 `"portrait"` 字符串在 **小写** 取决于设备方向.

> 如果框架支持设备在运行时的旋转,那么方向也应该在运行时取出,而不是从能力取出([App光谱](https://appium.io/docs/en/commands/session/orientation/get-orientation/)(中文(简体) )

参考: [TS WDIO 软件](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-webdriverio-5/src/spec-driver.ts#L220)

#### `getTitle`

此命令应当返回页面的标题 .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L179), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L54)

#### `getUrl`

此命令应当返回当前页面的url .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L182), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L58)

#### `takeScreenshot`

此命令应当使用默认框架 api 来取取视图端口的截图(**没有任何稳定**) (中文(简体) ). 结果应该作为 Base64 编码字符串返回.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L188), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L74)

#### `getElementRect`

此命令用于获取 **本地语言** 仅限元素。 此命令将不用于网络, 因为需要一个更复杂的算法 。 将结果作为带有属性的 JSON 对象返回 `x`, (中文(简体) ), `y`, (中文(简体) ), `width` 财务报告和审定财务报表 `height`,数值应保持分数,不需要四舍五入.

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L106)

#### `setWindowSize`

此命令应该从带有属性的给定 JSON 对象设置窗口大小 `width` 财务报告和审定财务报表 `height`。命令还必须将窗口位置设置到 (0,0) ,以便归档要设置的最大可能的窗口大小. 如果 [设置](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setViewportSize) 已经执行.

> **`WD!`** 硒的后遗症实施不允许采用单一方法设定大小和位置,在这种情况下,应当单独设置.

> **`CDP!`** 协议不支持窗口操纵,而是降低视门操纵,看看 [设置](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setViewportSize)。 。 。 .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/77fa7c7083d0c673acee3b203b1d0b1a7e972575/packages/eyes-selenium/src/spec-driver.ts#L123), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L45)

#### `getWindowSize`

此命令应当以 JSON 对象的格式返回窗口大小, 并带有属性 `width`,以及 `height`。 。 。 . 命令 **有过** 将执行,如果 [窗口大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setWindowSize) 已执行,如果 [设置](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setViewportSize) 已执行.

> **`WD!`** 现代对硒的应用没有得到窗口大小的api,而是可以使用得到窗口矩形的api.

> **`APPIUM!`** Appium服务器的后传版本无法很好地处理获得窗口矩形的命令,在这种情况下,应当发送获得窗口大小的命令.

> **`CDP!`** 协议不支持窗口操纵,而是降低视门操纵,看看 [获取 Viewport 大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##getViewportSize)。 。 。 .

参考: [TS 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-selenium/src/spec-driver.ts#L112), (中文(简体) ), [Ruby 硒](https://github.com/applitools/eyes.sdk.javascript1/blob/24c660e3cc7504d0547901f67a467324c45b2f25/rb/eyes-selenium/lib/applitools/selenium/spec-driver.rb#L41)

#### `setViewportSize`

此命令应当设定带有属性的给定 JSON 对象的视图大小 `width` 财务报告和审定财务报表 `height`。 。 。 .

> **`WD!`** 协议不允许直接操纵取景口. 执行 [窗口大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setWindowSize) 财务报告和审定财务报表 [获取窗口大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##getWindowSize) 换句话说.

参考: [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L98)

#### `getViewportSize`

此命令应返回带有属性的 JSON 对象格式的视图端口大小 `width` 财务报告和审定财务报表 `height`。此命令不一定需要执行,因为视图大小可以从浏览器中提取,但如果执行它可能更好,因为框架可能已经掌握了这些信息.

> **`WD!`** 协议不允许直接操纵取景口. 执行 [窗口大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##setWindowSize) 财务报告和审定财务报表 [获取窗口大小](https://npmcn.com/package/%40applitools/eyes-universal/#readme-##getWindowSize) 换句话说.

参考: [TS 剧作家](https://github.com/applitools/eyes.sdk.javascript1/blob/864f0ebfec04dd370631de1703817e098faa55b8/packages/eyes-playwright/src/spec-driver.ts#L95)

## 参考

Sdk必须与之操作的最重要对象是非串行性(如驱动器对象,眼睛即时),无法通过WebSocket协议发送. 它要求采用通用方法来表示非连续物体。 下面将描述一种必须用来在客户端和服务器端创建引用的方法.

参考执行情况: [联合来文的执行](https://github.com/applitools/eyes.sdk.javascript1/blob/1a54c6b3f28b25b41a708f5b600ceabbf8fc9db6/packages/eyes-universal/src/refer.js), (中文(简体) ), [Ruby 执行](https://github.com/applitools/eyes.sdk.javascript1/blob/poc/universal-ruby-sdk/rb/eyes-selenium/lib/applitools/refer.rb)

### 参考存储

参考文件应当有一个按键值存储,每个对象的参考文件都标出。 存储中的密钥是参考对象中使用的guid. 物品一旦不再使用,就应该从储存处取出。 存储应该支持不同引用之间的关系,意味着某些引用的存在应该取决于其他引用的存在(例如,当驱动程序已经被破坏时将元素保存在存储中是没有意义的).

### 参考格式

每个裁判都是JSON对象,只有一个财产 `applitools-ref-id` 带有 guid 字符串值.

```ts
{
  'applitools-ref-id': string
}
```

在某些情况下,如何可以扩展参考接口,以提供更多的关于它所提到的对象的数据,例如,在元素引用中添加关于选择者的信息是有道理的,在某些罕见的情况下,这样可以避免与服务器的前后通信.

### 参考使用

从服务器引用( 从命令) 收到的客户端 [Core. make Manager (管理者)](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Core.makeManager) 财务报告和审定财务报表 [眼睛管理者,打开眼睛](https://npmcn.com/package/%40applitools/eyes-universal/#readme-EyesManager.openEyes))只能用于执行与这些参考对象有关的其他服务器侧动作. 然而,客户端向服务器发送的引用将不可避免地在其中之一收到 [服务器启动的命令](https://npmcn.com/package/%40applitools/eyes-universal/#readme-Server-initiated-commands),在这种情况下,客户端应当参照收到的参考文献,参考需要的操作与实际对象.

## API 密码

API层是客户端执行中最大的部分,它应该抽象出最终用户从内部执行中使用 sdk的方式. 该层的主要功能目的应该是收集用户的所有配置和输入,并在应实际采取行动时发送. 这种架构的最大好处是API(sdk中最大和最混乱的部分)不应该为每个新框架反复被重新执行.

参考执行情况: [TS 眼睛动画](https://github.com/applitools/eyes.sdk.javascript1/tree/eyes-api/packages/eyes-api)

## 常见问题

### @applitools/eyes-universal 是什么？

Applitools 双眼通用 SDK

### 如何安装 @applitools/eyes-universal？

在项目目录运行 npm install @applitools/eyes-universal，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 eyes-universal，可以用 npx eyes-universal 直接运行。

### @applitools/eyes-universal 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/applitools\_\_eyes-universal 是否存在。

### @applitools/eyes-universal 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @applitools/eyes-universal 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=12\.13\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @applitools/eyes-universal 可以商用吗？

@applitools/eyes-universal 使用 SEE LICENSE IN LICENSE 许可。许可条款写在包内的独立文件中，请阅读该文件确认可否商用。以上为概括，不构成法律意见，请以许可原文为准。

### @applitools/eyes-universal 的下载量有多少？

根据 npm 官方下载统计，@applitools/eyes-universal 在 2026/10/07 – 2026/11/05 这 30 天内被下载 2,710 次，日均约 90 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @applitools/eyes-universal 还在维护吗？

最新版本 2\.18\.0 发布于 2022/12/27（3 年前）；至今共发布 137 个版本，其中过去 12 个月发布了 0 个；首次发布于 2021/06/01。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

