suggestAlternativesFromDocument method
Suggests alternative selectors based on the given document
Implementation
List<String> suggestAlternativesFromDocument(Document document) {
final suggestions = <String>[];
// If the primary selector works, no need for alternatives
if (validateDocument(document)) {
return suggestions;
}
// Try to find elements with similar tag names or classes
final parts = primarySelector.split(' ');
final lastPart = parts.last;
// Extract tag name and class from the last part
String? tagName;
String? className;
if (lastPart.contains('.')) {
final tagAndClass = lastPart.split('.');
tagName = tagAndClass[0].isEmpty ? null : tagAndClass[0];
className = tagAndClass.length > 1 ? tagAndClass[1] : null;
} else if (lastPart.contains('#')) {
final tagAndId = lastPart.split('#');
tagName = tagAndId[0].isEmpty ? null : tagAndId[0];
} else {
tagName = lastPart;
}
// Try tag name only
if (tagName != null && tagName.isNotEmpty) {
final tagSelector =
'${parts.sublist(0, parts.length - 1).join(' ')}${parts.length > 1 ? ' ' : ''}$tagName';
if (document.querySelectorAll(tagSelector).isNotEmpty) {
suggestions.add(tagSelector);
}
}
// Try similar classes
if (className != null && className.isNotEmpty) {
// Find elements with class names containing the target class
final allElements = document.querySelectorAll('*');
final classSet = <String>{};
for (final element in allElements) {
final classes = element.classes;
for (final cls in classes) {
if (cls.contains(className) || className.contains(cls)) {
classSet.add(cls);
}
}
}
for (final cls in classSet) {
if (cls != className) {
final classSelector =
'${parts.sublist(0, parts.length - 1).join(' ')}${parts.length > 1 ? ' ' : ''}${tagName != null && tagName.isNotEmpty ? tagName : ''}.$cls';
if (document.querySelectorAll(classSelector).isNotEmpty) {
suggestions.add(classSelector);
}
}
}
}
// Try parent elements
if (parts.length > 1) {
final parentSelector = parts.sublist(0, parts.length - 1).join(' ');
if (document.querySelectorAll(parentSelector).isNotEmpty) {
suggestions.add(parentSelector);
}
}
return suggestions;
}