¿Cómo obtener elementos por nombre en Delphi Chromium Embedded?

Para obtener un nodo DOM particular incrustado en el documento web actual desde una instancia de TChromium, usando su ID, use ICefDomDocument.getElementById (). Pero, ¿cómo encontrar elementos por el atributo NOMBRE? Javascript tiene el método document.getElementsByName () y TWebBrowser (que envuelve IE) tiene una llamada similar, pero no puedo averiguar cómo hacer esto con TChromium. Necesito encontrar algunos elementos DOM que tengan atributos NAME pero no atributos ID. Busqué en elceflib Unidad y no vio nada que lo hiciera.

Pregunta de lado. Si alguien tiene un enlace a un sitio o documento de estilo de "Recetas" de TChromium, podría usarlo.

ACTUALIZACIÓN: Mientras espero una respuesta, he encontrado el siguiente código para hacer getElementsbyName (). Me gustaría algo más rápido que escanear todo el árbol DOM. Si ve algo mal en el código, hágamelo saber:

type
    TDynamicCefDomNodeArray = array of ICefDomNode;


// Given a Chromium document interface reference and a NAME attribute to search for,
//  return an array of all DOM nodes whose NAME attribute matches the desired.
function getElementsByName(ADocument: ICefDomDocument; theName: string): TDynamicCefDomNodeArray;

    // Get all the elements with a particular NAME attribute value and return
    //  an array of them.
    procedure getElementsByName1(intfParentNode: ICefDomNode; theName: string; var aryResults: TDynamicCefDomNodeArray);
    var
        oldLen: integer;
        intfChildNode: ICefDomNode;
        theNameAttr: string;
    begin
        Result := nil;
        intfChildNode := nil;

        if Assigned(intfParentNode) then
        begin
            // Attributes are case insensitive.
            theNameAttr := intfParentNode.GetElementAttribute('name');

            if AnsiSameText(theNameAttr, theName) then
            begin
                // Name attribute match.  Add it to the results array.
                oldLen := Length(aryResults);
                SetLength(aryResults, oldLen + 1);
                aryResults[oldLen] := intfParentNode;
            end; // if AnsiSameText(intfParentNode.Name, theName) then

            // Does the parent node have children?
            if intfParentNode.HasChildren then
            begin
                intfChildNode := intfParentNode.FirstChild;

                // Scan them.
                while Assigned(intfChildNode) do
                begin
                    getElementsByName1(intfChildNode, theName, aryResults);

                    if Assigned(intfChildNode) then
                        intfChildNode := intfChildNode.NextSibling;
                end;
            end; // if intfParentNode.HasChildren then
        end; // if Assigned(intfParentNode) then
    end;

    // ---------------------------------------------------------------

var
    intfCefDomNode: ICefDomNode;
begin
    intfCefDomNode := nil;
    Result := nil;

    if Assigned(ADocument) then
    begin
        // Check the header.
        intfCefDomNode := ADocument.Document;

        if Assigned(intfCefDomNode) then
        begin
            // Check the parent.
            getElementsByName1(intfCefDomNode, theName, Result);
        end; // if Assigned(intfCefDomNode) then
    end; // if Assigned(ADocoument) then
end;

// ---------------------------------------------------------------

Respuestas a la pregunta(1)

Su respuesta a la pregunta