suggestAlternativesFromDocument method

List<String> suggestAlternativesFromDocument(
  1. Document document
)

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;
}