handleClickInteractionSite method

Future<HeadlessBrowserResult> handleClickInteractionSite(
  1. String url, {
  2. Map<String, String>? headers,
  3. Map<String, String>? selectors,
  4. Map<String, String>? attributes,
  5. int? timeoutMillis,
  6. String? clickSelector,
  7. int clickDelay = 1000,
  8. int maxClicks = 1,
})

Handles a site that requires clicking elements

Implementation

Future<HeadlessBrowserResult> handleClickInteractionSite(
  String url, {
  Map<String, String>? headers,
  Map<String, String>? selectors,
  Map<String, String>? attributes,
  int? timeoutMillis,
  String? clickSelector,
  int clickDelay = 1000,
  int maxClicks = 1,
}) async {
  _logger.info('Handling click interaction site: $url');

  final result = await _service.scrapeUrl(
    url,
    headers: headers,
    timeoutMillis: timeoutMillis,
  );

  if (!result.success || clickSelector == null) {
    return result;
  }

  // Wait for the element to be present
  final elementPresent = await _service.waitForElement(clickSelector);
  if (!elementPresent) {
    _logger.error('Click selector not found: $clickSelector');
    return HeadlessBrowserResult.failure(
      errorMessage: 'Click selector not found: $clickSelector',
      elapsedMillis: result.elapsedMillis,
    );
  }

  // Click the element
  for (int i = 0; i < maxClicks; i++) {
    final clickResult = await _service.executeScript('''
      (function() {
        const elements = document.querySelectorAll('$clickSelector');
        if (elements.length === 0) return false;

        const element = elements[$i];
        element.click();
        return true;
      })();
    ''');

    if (clickResult != true) {
      _logger.error('Failed to click element: $clickSelector');
      break;
    }

    await Future.delayed(Duration(milliseconds: clickDelay));
  }

  // Extract data if selectors provided
  Map<String, dynamic>? extractedData;
  if (selectors != null && selectors.isNotEmpty) {
    extractedData = await _service.executeScript('''
      (function() {
        const result = {};
        ${selectors.entries.map((entry) {
      final key = entry.key;
      final selector = entry.value;
      final attribute = attributes?[key];

      if (attribute != null) {
        return '''
              result["$key"] = Array.from(document.querySelectorAll('$selector'))
                .map(el => el.getAttribute('$attribute'))
                .filter(val => val !== null);
            ''';
      } else {
        return '''
              result["$key"] = Array.from(document.querySelectorAll('$selector'))
                .map(el => el.textContent.trim())
                .filter(val => val !== "");
            ''';
      }
    }).join('\n')}
        return result;
      })();
    ''');
  }

  // Get updated HTML
  final html = await _service.executeScript(
    'document.documentElement.outerHTML',
  );

  return HeadlessBrowserResult.success(
    html: html,
    data: extractedData,
    elapsedMillis: result.elapsedMillis,
  );
}