| 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'))!); |
| } |
| } |