Skip to content

Commit

Permalink
Merge pull request #41 from nut-tree/feature/37/screenshot_methods
Browse files Browse the repository at this point in the history
Feature/37/screenshot methods
  • Loading branch information
s1hofmann committed Mar 5, 2019
2 parents 03672e4 + 7c1faad commit baca0ef
Show file tree
Hide file tree
Showing 21 changed files with 608 additions and 327 deletions.
3 changes: 0 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ node_js:
- "lts/dubnium"
cache: npm

notifications:
webhooks: https://outlook.office.com/webhook/b6e4942d-6066-4001-8ba1-428598f3ae13@eb86a0ab-5bd0-4070-b04f-b7bf90ca02c5/TravisCI/ad6b89add60a4d4c8d1a06aa4ee424e8/d6c06c79-667d-43b9-92b6-0e9687d93d0f

addons:
sonarcloud:
organization: "nut-tree"
Expand Down
16 changes: 8 additions & 8 deletions demo/mouse.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ const square = async () => {
};

(async () => {
mouse
.leftClick()
// await square();
await mouse
.leftClick();
await square();
try {
screen.config.resourceDirectory = "./assets";
const whale = await screen.findOnScreen("docker.png");
mouse.move(await movement.straightTo(Location.centerOf(whale)));
await mouse.move(await movement.straightTo(Location.centerOf(whale)));

const gitlens = await screen.findOnScreen("gitlens.png");
mouse.move(await movement.straightTo(Location.centerOf(gitlens)));
mouse.drag(await movement.right(600));
mouse.move(await movement.straightTo(Location.centerOf(gitlens)));
mouse.drag(await movement.straightTo(Location.centerOf(whale)));
await mouse.move(await movement.straightTo(Location.centerOf(gitlens)));
await mouse.drag(await movement.right(600));
await mouse.move(await movement.straightTo(Location.centerOf(gitlens)));
await mouse.drag(await movement.straightTo(Location.centerOf(whale)));
} catch (error) {
console.log(error);
}
Expand Down
2 changes: 1 addition & 1 deletion index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const clipboard = new Clipboard(nativeActions);
const keyboard = new Keyboard(nativeActions);
const mouse = new Mouse(nativeActions);
const movement = new Movement(nativeActions, new LineHelper());
const screen = new Screen(screenActions, nativeActions);
const screen = new Screen(screenActions);
const assert = new Assert(screen);

export { clipboard, keyboard, mouse, movement, screen, assert };
124 changes: 15 additions & 109 deletions lib/adapter/native.adapter.class.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,19 @@ import { Point } from "../point.class";
import { ClipboardAction } from "../provider/native/clipboardy-clipboard-action.class";
import { KeyboardAction } from "../provider/native/robotjs-keyboard-action.class";
import { MouseAction } from "../provider/native/robotjs-mouse-action.class";
import { ScreenAction } from "../provider/native/robotjs-screen-action.class";
import { Region } from "../region.class";
import { NativeAdapter } from "./native.adapter.class";

jest.mock("../provider/native/clipboardy-clipboard-action.class");
jest.mock("../provider/native/robotjs-mouse-action.class");
jest.mock("../provider/native/robotjs-keyboard-action.class");
jest.mock("../provider/native/robotjs-screen-action.class");

describe("Native adapter class", () => {
it("should delegate calls to grabScreen", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);

// WHEN
SUT.grabScreen();

// THEN
expect(screenMock.grabScreen).toBeCalledTimes(1);
});

it("should delegate calls to grabScreenRegion", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const screenRegion = new Region(0, 0, 100, 100);

// WHEN
SUT.grabScreenRegion(screenRegion);

// THEN
expect(screenMock.grabScreenRegion).toBeCalledTimes(1);
expect(screenMock.grabScreenRegion).toBeCalledWith(screenRegion);
});

describe("NativeAdapter class", () => {
it("should delegate calls to setMouseDelay", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const delay = 5;

// WHEN
Expand All @@ -68,8 +32,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const newPosition = new Point(10, 10);

// WHEN
Expand All @@ -85,8 +48,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);

// WHEN
SUT.currentMousePosition();
Expand All @@ -95,58 +57,12 @@ describe("Native adapter class", () => {
expect(mouseMock.currentMousePosition).toBeCalledTimes(1);
});

it("should delegate calls to screenWidth", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);

// WHEN
SUT.screenWidth();

// THEN
expect(screenMock.screenWidth).toBeCalledTimes(1);
});

it("should delegate calls to screenHeight", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);

// WHEN
SUT.screenHeight();

// THEN
expect(screenMock.screenHeight).toBeCalledTimes(1);
});

it("should delegate calls to screenSize", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);

// WHEN
SUT.screenSize();

// THEN
expect(screenMock.screenSize).toBeCalledTimes(1);
});

it("should delegate calls to leftClick", () => {
// GIVEN
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);

// WHEN
SUT.leftClick();
Expand All @@ -160,8 +76,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);

// WHEN
SUT.rightClick();
Expand All @@ -175,8 +90,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);

// WHEN
SUT.middleClick();
Expand All @@ -190,8 +104,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const buttonToPress = Button.LEFT;

// WHEN
Expand All @@ -207,8 +120,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const buttonToRelease = Button.LEFT;

// WHEN
Expand All @@ -224,8 +136,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const keyToPress = Key.A;

// WHEN
Expand All @@ -241,8 +152,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const keyToRelease = Key.A;

// WHEN
Expand All @@ -258,8 +168,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const keyToClick = Key.A;

// WHEN
Expand All @@ -275,8 +184,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const stringToType = "testString";

// WHEN
Expand All @@ -292,8 +200,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);
const stringToCopy = "testString";

// WHEN
Expand All @@ -309,8 +216,7 @@ describe("Native adapter class", () => {
const clipboardMock = new ClipboardAction();
const keyboardMock = new KeyboardAction();
const mouseMock = new MouseAction();
const screenMock = new ScreenAction();
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock, screenMock);
const SUT = new NativeAdapter(clipboardMock, keyboardMock, mouseMock);

// WHEN
SUT.paste();
Expand Down
62 changes: 0 additions & 62 deletions lib/adapter/native.adapter.class.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Button } from "../button.enum";
import { Image } from "../image.class";
import { Key } from "../key.enum";
import { Point } from "../point.class";
import { ClipboardActionProvider } from "../provider/native/clipboard-action-provider.interface";
Expand All @@ -8,9 +7,6 @@ import { KeyboardActionProvider } from "../provider/native/keyboard-action-provi
import { MouseActionInterface } from "../provider/native/mouse-action-provider.interface";
import { KeyboardAction } from "../provider/native/robotjs-keyboard-action.class";
import { MouseAction } from "../provider/native/robotjs-mouse-action.class";
import { ScreenAction } from "../provider/native/robotjs-screen-action.class";
import { ScreenActionProvider } from "../provider/native/screen-action-provider.interface";
import { Region } from "../region.class";

/**
* NativeAdapter serves as an abstraction layer for all OS level interactions.
Expand All @@ -24,30 +20,8 @@ export class NativeAdapter {
private clipboard: ClipboardActionProvider = new ClipboardAction(),
private keyboard: KeyboardActionProvider = new KeyboardAction(),
private mouse: MouseActionInterface = new MouseAction(),
private screen: ScreenActionProvider = new ScreenAction(),
) {}

/**
* grabScreen will return an Image containing the current screen image
*
* @returns {Promise<Image>} Image will contain screenshot data as well as dimensions
* @memberof NativeAdapter
*/
public grabScreen(): Promise<Image> {
return this.screen.grabScreen();
}

/**
* grabScreenRegion essentially does the same as grabScreen, but only returns a specified Region
*
* @param {Region} region The screen region we want to grab
* @returns {Promise<Image>} Image will contain screenshot data of the specified region as well as dimensions
* @memberof NativeAdapter
*/
public grabScreenRegion(region: Region): Promise<Image> {
return this.screen.grabScreenRegion(region);
}

/**
* setMouseDelay configures mouse speed for movement
*
Expand Down Expand Up @@ -88,42 +62,6 @@ export class NativeAdapter {
return this.mouse.currentMousePosition();
}

/**
* screenWidth returns the main screen's width as reported by the OS.
* Please notice that on e.g. Apples Retina display the reported width
* and the actual pixel size may differ
*
* @returns {Promise<number>} The main screen's width as reported by the OS
* @memberof NativeAdapter
*/
public screenWidth(): Promise<number> {
return this.screen.screenWidth();
}

/**
* screenHeight returns the main screen's height as reported by the OS.
* Please notice that on e.g. Apples Retina display the reported width
* and the actual pixel size may differ
*
* @returns {Promise<number>} The main screen's height as reported by the OS
* @memberof NativeAdapter
*/
public screenHeight(): Promise<number> {
return this.screen.screenHeight();
}

/**
* screenSize returns a Region object with the main screen's size.
* Please notice that on e.g. Apples Retina display the reported width
* and the actual pixel size may differ
*
* @returns {Promise<Region>} The Region object the size of your main screen
* @memberof NativeAdapter
*/
public screenSize(): Promise<Region> {
return this.screen.screenSize();
}

/**
* leftClick triggers a native left-click event via OS API
*
Expand Down

0 comments on commit baca0ef

Please sign in to comment.