name: clickSelectorNative
bindDescriprion: "`Wait selector: '${selector}' and click`"
needSelectors: ['selector']
needData: ['selectorNumber?']
allowOptions:
  - 'count'
  - 'timeDelayBeforeClick'
  - 'logAfter'
  - 'hidden'
  - 'visible'
  - 'timeDelayBeforeWait'
  - 'timeDelayAfterWait'
  - 'timeDelayAfterClick'
  - 'waitingTime'
logOptions: { logChildren: false }

runTest:
  - waitForSelector:
      description: Wait selector
      bindSelector: { selector: selector }

  - blank:
      if: 'selectorNumber === null'
      const: { selectorNumber: 0 }

  - blank:
      description: Click
      bindData: { selectorNumber: selectorNumber }
      bindSelector: { selector: selector }
      bindDescriprion: "`Click selector: '${selector}'`"
      needSelectors: ['selector']
      needData: ['selectorNumber?']
      allowOptions: ['count', 'timeDelayBeforeClick', 'logAfter', 'timeDelayAfterClick']
      inlineJS: >
        const { selector } = this.selectors;
        const selectorNumber = this.data.selectorNumber || 0;
        const {
          count = 1,
          timeDelayBeforeClick = 0,
          logAfter = false,
          timeDelayAfterClick = 0,
        } = this.options;
        const element = ((await this.getElement(selector, true)) || [])[selectorNumber];

        if (timeDelayBeforeClick) {
          await this.page.waitForTimeout(timeDelayBeforeClick);
        }

        try {
          if (!logAfter) {
            await this.log({ text: `Click selector: '${selector}'`, element });
          }

          if (this.getEngine('playwright')) {
            await this.page.evaluate(
              ({ element, count }) => {
                for (let i = 0; i < count; i++) {
                  element.click();
                }
              },
              { element, count },
            );
          } else if (this.getEngine('puppeteer')) {
            await this.page.evaluate(
              (element, count) => {
                for (let i = 0; i < count; i++) {
                  element.click();
                }
              },
              element,
              count,
            );
          } else {
            throw new Error(`There is unknown engine ${this.getEngine()}`);
          }

          if (logAfter) {
            await this.log({ text: `Click selector: '${selector}'`, element });
          }
        } catch (error) {
          await this.log({
            text: `Can't click selector: '${selector}'`,
            element,
            screenshot: true,
            extendInfo: true,
            level: 'error',
          });
          throw error;
        }

        if (timeDelayAfterClick) {
          await this.page.waitForTimeout(timeDelayAfterClick);
        }

        await element.dispose();