handleFormSubmissionSite method

Future<HeadlessBrowserResult> handleFormSubmissionSite(
  1. String url, {
  2. Map<String, String>? headers,
  3. Map<String, String>? selectors,
  4. Map<String, String>? attributes,
  5. int? timeoutMillis,
  6. required Map<String, String> formData,
  7. String? formSelector,
  8. String? submitSelector,
  9. int waitAfterSubmit = 3000,
})

Handles a site that requires form submission

Implementation

Future<HeadlessBrowserResult> handleFormSubmissionSite(
  String url, {
  Map<String, String>? headers,
  Map<String, String>? selectors,
  Map<String, String>? attributes,
  int? timeoutMillis,
  required Map<String, String> formData,
  String? formSelector,
  String? submitSelector,
  int waitAfterSubmit = 3000,
}) async {
  _logger.info('Handling form submission site: $url');

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

  if (!result.success) {
    return result;
  }

  // Fill form fields
  for (final entry in formData.entries) {
    final fieldName = entry.key;
    final fieldValue = entry.value;

    await _service.executeScript('''
      (function() {
        const field = document.querySelector('input[name="$fieldName"], textarea[name="$fieldName"], select[name="$fieldName"]');
        if (!field) return false;

        field.value = '$fieldValue';

        // Trigger change event
        const event = new Event('change', { bubbles: true });
        field.dispatchEvent(event);

        return true;
      })();
    ''');
  }

  // Submit form
  if (submitSelector != null) {
    await _service.executeScript('''
      (function() {
        const submitButton = document.querySelector('$submitSelector');
        if (!submitButton) return false;

        submitButton.click();
        return true;
      })();
    ''');
  } else if (formSelector != null) {
    await _service.executeScript('''
      (function() {
        const form = document.querySelector('$formSelector');
        if (!form) return false;

        form.submit();
        return true;
      })();
    ''');
  }

  // Wait for form submission to complete
  await Future.delayed(Duration(milliseconds: waitAfterSubmit));

  // 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,
  );
}