blob: 57adf4b5314596d96788db7f4f76fdc8e7d21c29 [file] [log] [blame]
import {PageObject} from '../../../infra-sk/modules/page_object/page_object';
import {PageObjectElement, PageObjectElementList} from '../../../infra-sk/modules/page_object/page_object_element';
import {Digest} from '../rpc_types';
export class ClusterDigestsSkPO extends PageObject {
private get nodes(): PageObjectElementList {
return this.bySelectorAll('circle.node');
}
private get selectedNodes(): PageObjectElementList {
return this.bySelectorAll('circle.node.selected');
}
private get background(): PageObjectElement {
return this.bySelector('svg');
}
async clickNode(digest: Digest) {
await this.dispatchClickEventOnNode(digest, /* shiftKey= */ false);
}
async shiftClickNode(digest: Digest) {
await this.dispatchClickEventOnNode(digest, /* shiftKey= */ true);
}
private async dispatchClickEventOnNode(digest: Digest, shiftKey: boolean) {
// SVGElements (https://developer.mozilla.org/en-US/docs/Web/API/SVGElement) do not have a
// .click() method, like HTMLElements do. Thus, we have no alternative but to simulate a click
// via a fake MouseEvent. This ensures compatibility with both Karma and Puppeteer tests.
const node =
await this.nodes.find(async (node) => (await node.getAttribute('data-digest')) === digest);
await node!.applyFnToDOMNode((el, shiftKey) => {
el.dispatchEvent(new MouseEvent('click', {shiftKey: shiftKey as boolean}));
}, shiftKey);
}
async clickBackground() {
await this.background.click();
}
async getSelection(): Promise<Digest[]> {
return this.selectedNodes.map(async (circle) => (await circle.getAttribute('data-digest'))!);
}
}