fnGenerateWithNextParent = function () {
                oAncestor = oAncestor && oAncestor.getParent() || oOptions.control.getParent();
                iLevel += 1;
                // look up the tree until maxDepth is reached,
                // and for every parent, look though its aggregations for a relative (sibling) - and continue this down the tree
                if (oAncestor && iLevel < _ControlSelectorGenerator._maxDepth) {
                    var aSiblings = [];
                    var aAggregated = _ControlSelectorGenerator._getAggregatedControls(oAncestor.mAggregations);
                    aAggregated.forEach(function (oAggregatedControl) {
                        if (oAggregatedControl !== oOptions.control) {
                            aSiblings.push(oAggregatedControl);
                            // look "down" through the aggregated controls' aggregations
                            aSiblings = aSiblings.concat(_ControlSelectorGenerator._getAggregatedControls(oAggregatedControl.mAggregations));
                        }
                    });
                    _oLogger.debug("Found " + aSiblings.length + " siblings at level " + iLevel + " with ancestor " + oAncestor);
                    return _ControlSelectorGenerator._generateSelectorWithUniqueSiblingAtLevel({
                        options: oOptions,
                        targetMultiSelector: mTargetMultiSelector,
                        level: {
                            siblings: aSiblings,
                            number: iLevel,
                            width: _ControlSelectorGenerator._maxWidth
                        }
                    }).then(function (mSelector) {
                        resolve(mSelector);
                    }).catch(function () {
                        return fnGenerateWithNextParent();
                    });
                } else {
                    reject(new Error("Could not generate unique sibling selector at level " + iLevel));
                }
            }
Search the ancestors' aggregations for controls with unique selectors.
For each ancestor, search its aggregations. For each child, try to generate a unique selector.
Find the "closest" child with unique selector (with closest ancestor)
@param {object} oOptions options to configure selector generation
@param {object} mTargetMultiSelector intermediate selector for the target - not unique
@returns {object} a selector
@private