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