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