JavaScript 데스크탑 자동화

안녕하세요.
오늘은 제가 최근에 하고 있는 프로젝트를 보여드리고 싶습니다.

견과나무 / 견과류회사 명


노드를 사용하여 네이티브 UI 테스트/제어


견과류js(네이티브 UI 키트)


GitHub 작업
주인

발전





네이티브 UI 테스트/노드 자동화회사 명

에 관하여


nut.js는 플랫폼에 걸쳐 네이티브 UI 자동화/테스트 도구입니다.
키보드 및/또는 마우스를 통해 네이티브 UI 상호 작용 가능
또한 화면에 이미지와 일치하도록 탐색할 수도 있습니다.

예제


nut-tree/trailmix 너트 사용법을 보여 주는 기존의 예시를 포함한다.js.

토론


nut-tree/rfc 파일에서 너트의 큰 설계/구현 변경에 대해 설명합니다.js 토론이 필요합니다.

모듈


이 목록에는 현재 구현 및 계획의 기능이 요약되어 있습니다.
이 작업은 현재 진행 중이며, 끊임없이 수정될 것이다.

클립보드


클립보드에 텍스트 복사 클립보드에서 텍스트 붙여넣기

키보드


표준 미국 키보드 레이아웃 지원독일어 특수 문자 지원

쥐.


마우스 이동 지원마우스 스크롤 지원이동 속도 구성 가능마우스 드래그

창문.


모든 창 목록 활성 창 검색 창 제목 검색 … View on GitHub
쉽게 말하면 견과류.js(Native Ui Toolkit의 줄임말)를 사용하면 마우스, 키보드, 클립보드를 원격으로 제어할 수 있습니다.지금까지 새로운 것은 없었고, 상당히 많은 소프트웨어 패키지가 이 기능을 제공했다.
내가nut를 짓기 시작한 이유.js는 하나의 사실입니다. 기존의 도구는 내가 그림을 바탕으로 커서를 제어하는 것을 허락하지 않습니다.키보드 단축키를 사용하면 많은 일을 할 수 있지만, 솔직히 말하자면, 많은 응용 프로그램은 마우스의 상호작용을 위해 설계된 것이다.좌표로만 이 점을 실현하는 것은 공상일 수밖에 없다.
나는 대학 때 이미지 처리와 컴퓨터 시각적인 일을 많이 했기 때문에 주말에 앉아서 기존의 도구를 고치기 시작했다.내가 말할 수 있는 것은, 그것은 매우 잘 운행되고, 나는 첫 번째 원형을 기초할 수 있다는 것이다.
액체 오류: 내부
몇 주가 지났는데, 나는 줄곧 나의 작은 프로젝트를 하고 있으며, 동시에 전업으로 고객 프로젝트를 하고 있다.일이 서서히 함께 진행되기 시작했다. 어머, 세상에. 플랫폼을 뛰어넘는 원생 도구의 일이 너에게 많은 것을 가르쳐 주었다.

창고

nut.js 다음 기술 스택을 사용하여 구축합니다.
  • node
  • TypeScript
  • Native Addons for Node.js
  • N-API
  • Jest
  • GitHub
  • travis-ci
  • Docker
  • SonarCloud
  • GreenKeeper
  • 이것은 node의 현재 LTS 버전을 사용하여 구축된 것입니다. (본문을 작성할 때: node 10, LTS/Dubinium이라고도 함), node 12 지원 (다음 LTS 버전) 이 곧 다가옵니다.유형 보안은 멋진 일이기 때문에 TypeScript를 사용하기로 결정했습니다:).
    현재 CI에서만 Travis를 사용하고 있지만 조만간 AppVeyor를 추가할 수 있습니다(나중에 자세히 설명 드리겠습니다).CI 구축은 VNC Docker 컨테이너를 사용하여 정의된 UI 상태로 헤드 없는 E2E 테스트를 실행합니다. 이것은 모든 것이 예상대로 작동하는지 확인하는 좋은 방법입니다.
    Sonar Cloud는 몇 가지 지표와 품질 관문을 제공했고 Green Keeper는 나의 의존항을 최신 상태로 유지했다.
    요컨대 이것은 상당히 괜찮은 설정으로 단독적인 직위를 가질 만하다.

    현지인이 되다


    견과류js는 본 컴퓨터의 플러그인을 대량으로 사용합니다. Native Addons for Node.js 컴파일도 사용하고 최근에는 N-API 컴파일도 사용합니다.이 컴퓨터의 키보드와 마우스 제어 자동화는 노드 C++ 플러그인만 사용할 수 있는 시스템급 API 호출이 필요합니다.너트의 current release.js 사용octalmage/robotjs의 포크.나는 노드 v10을 발표하지 않았기 때문에 처음으로 분할 환매했다.robotjs의 x, 곧 발표될 노선도에 관해서는 없습니다.곧 발표될 nut에 대해jsIported this fork to N-API는 미래의 노드 버전에서 사용하기 쉽고 자신의 속도에 따라 확장할 수 있습니다.
    이미지 기반 마우스 이동에는 opencv4nodejs 을 사용합니다.OpenCV의 여러 노드 귀속을 비교한 후에 나는 이 라이브러리가 노드에 가장 좋은 최신 OpenCV 귀속을 제공했다고 확신할 수 있다.다시 한 번, 나는 내 포크를 썼다.
    opencv4nodejs는 패키지를 설치할 때 처음부터 OpenCV를 구축하고 C++ 플러그인을 컴파일하는 메커니즘을 제공합니다.
    이런 방법이 가장 유연할 수 있지만 소프트웨어 패키지를 설치하는 데는 30여 분이 걸린다.
    opencv4nodejs-prebuilt에 대해 저는 빠른 크로스플랫폼 설치를 실현하는 데 상당한 시간을 들였습니다.opencv4nodejs 사전 컴파일은 Windows, Linux, macOS에 대한 독선적인 기존 버전을 제공하지만, 필요하면 다시 컴파일할 수 있습니다.이러한 설정에는 여러 패키지가 포함됩니다.
  • Windows, Linux, macOS를 위한 플랫폼별 npm 패키지, 미리 컴파일된 OpenCV libs
  • 플랫폼 및 노드 버전별 사전 컴파일된 OpenCV 바인딩, 사용prebuild
  • 조금만 조정하면 미리 구축된 모든 귀속도 필요한 OpenCVlibs를 첨부하여 GitHub releases 에서 설치할 수 있습니다.prebuild-install 주어진 플랫폼 + 노드 버전 조합의 정확한 귀속을 다운로드하여 컴파일할 필요가 없습니다.적절한 귀속을 사용할 수 없거나 실행할 때 검사가 실패하면 재구축을 촉발합니다.

    상자 안에 무엇이 있습니까?


    견과류js는 특정 운영 체제 기능에 액세스하기 위해 객체를 내보냅니다.
    export {
      clipboard,
      keyboard,
      mouse,
      screen,
      ...
    };
    
    대부분의 객체(클립보드를 제외하고)에는 공통 config 객체가 포함되어 있습니다. 이 객체는 입력 속도, 마우스 속도 또는 이미지 경로와 같이 화면 일치를 위해 일부 부분을 조정할 수 있습니다.

    키보드


    프레젠테이션keyboard 사용:
    "use strict";
    
    const { keyboard, Key, sleep } = require("@nut-tree/nut-js");
    
    const openLauncher = async () => {
      await keyboard.type(Key.LeftAlt, Key.F2);
    };
    
    describe("Keyboard test", () => {
      it("should open Thunar", async () => {
        await openLauncher();
        await keyboard.type("thunar");
        await keyboard.type(Key.Return);
        await sleep(1000);
        await keyboard.type(Key.LeftAlt, Key.F4);
      });
    });
    
    보시다시피 keyboard 를 통해 텍스트, 단축키 또는 조합키를 입력할 수 있습니다.

    쥐.


    마우스 이동은 간단한 모드를 따릅니다.
    mouse.move(...);
    
    Point{x, y}의 좌표 서열을 사용하여 따를 경로를 설명합니다.그 밖에 너트.js 고급 이동 기능 내보내기:
    "use strict";
    
    const { mouse, right, down, left, up } = require("@nut-tree/nut-js");
    
    const square = async () => {
      await mouse.move(right(500));
      await mouse.move(down(500));
      await mouse.move(left(500));
      await mouse.move(up(500));
    };
    
    describe("Basic mouse test", () => {
        it("should move the mouse in square shape", async () => {
            jest.setTimeout(10000);
            await square();
        });
    });
    
    left(x)
    right(x)
    up(x)
    down(x)
    
    현재 마우스 위치에 해당하는 방향x의 픽셀 경로를 반환합니다.

    스크린


    이러한 모드는 화면 캡처 기반 마우스 이동과 관련하여 더욱 확장됩니다.
    "use strict";
    
    const { screen, mouse, centerOf, straightTo } = require("@nut-tree/nut-js");
    
    describe("Basic mouse test", () => {
        it("should move the mouse in square shape", async () => {
            jest.setTimeout(10000);
            screen.config.resourceDirectory = "../../e2e/assets";
    
            await mouse.move(straightTo(centerOf(screen.find("mouse.png"))));
        });
    });
    
    screen.config.resourceDirectory = "../../e2e/assets"; 이미지 파일을 로드하는 경로를 구성합니다.
    이제 마우스를 화면의 템플릿 이미지 위치로 이동하기 위해nut.js는 다음 모드를 적용합니다.
  • screen.find("mouse.png"); 스크린
  • 에 템플릿 이미지를 저장하는 좌표를 반환하는 Region 객체
  • {left, top, width, height}주어진 centerOf(x)x
  • 의 중심Pointp 반환
  • Region 현재 마우스 위치에서 주어진 straightTo(p)p
  • 까지의 직선 경로 계산
  • Point 우리가 이전에 보았던 경로를 따른다
  • 그림을 검색할 때nut를 사용하십시오.js는 여러 개의 이미지 비율과 픽셀 밀도를 처리합니다.따라서 이미지 기반 동작이 줌과 다른 디스플레이 유형에 대해 루팡성을 가지게 됩니다.

    농담 중매쟁이


    앞에 표시된 모든 예제 세션은 일반 Jest 테스트입니다.Jest는 특정 테스트 값에 대해 일치기를 사용합니다.너트의 e2e 테스트를 작성할 때나는 자신의 matchers를nut에 쓸 수 있는지 매우 궁금하다.js.이것은 마우스 위치나 화면에 이미지가 표시되는지 확인하는 좋은 기능이 될 것입니다.
    "use strict";
    
    const {jestMatchers, mouse, screen, Point, Region} = require("@nut-tree/nut-js");
    
    beforeAll(() => {
        expect.extend(jestMatchers);
    });
    
    describe("Basic test with custom Jest matchers", () => {
        it("should verify that cursor is at a certain position", async () => {
            // GIVEN
            const targetPoint = new Point(10, 10);
            const targetRegion = new Region(20, 20, 30, 30);
    
            // WHEN
            await mouse.setPosition(targetPoint);
    
            // THEN
            expect(mouse).toBeAt(targetPoint);
            expect(mouse).not.toBeIn(targetRegion);
        });
    
        it("should verify that the screen shows a certain image", async () => {
            // GIVEN
            screen.config.resourceDirectory = "../../e2e/assets";
    
            // WHEN
    
            // THEN
            await expect(screen).toShow("mouse.png");
        });
    });
    
    뛰어난 문서 덕분에 Jest 확장이 용이합니다!:)

    앞으로 무슨 일이 일어날까요?


    너트의 미래 버전에 사용됩니다.js는 OCR 지원을 포함할 계획입니다. 다음 버전은 최신 OpenCV 4를 사용할 것입니다.x와libnut.나는 또한 크로스플랫폼 디스플레이 기능을 제공하는 방법을 연구했는데 이것은 시각화 디버깅에 매우 유용하다.
    가능한 기능에 대해 궁금한 점이나 생각이 있으시면 언제든지 open an issue!:)
    이렇게 오래
    시몬

    좋은 웹페이지 즐겨찾기