Jak zdobyć elementy po nazwie w Delphi Chromium Embedded?

Aby uzyskać konkretny węzeł DOM osadzony w bieżącym dokumencie WWW z instancji TChromium, używając jego identyfikatora, należy użyć ICefDomDocument.getElementById (). Ale jak znaleźć elementy według atrybutu NAME? Javascript ma metodę document.getElementsByName (), a TWebBrowser (która otacza IE) ma podobne wywołanie, ale nie mogę wymyślić, jak to zrobić z TChromium. Muszę znaleźć elementy DOM, które mają atrybuty NAME, ale nie mają atrybutów ID. Przeszukałemceflib i nie widziałem niczego, co by to zrobiło.

Pytanie dodatkowe. Jeśli ktoś ma link do witryny lub dokumentu w stylu „przepisów” TChromium, mógłbym z niego skorzystać.

UPDATE: Podczas oczekiwania na odpowiedź wymyśliłem następujący kod do wykonania getElementsbyName (). Chciałbym coś szybszego niż skanowanie całego drzewa DOM. Jeśli widzisz coś złego w kodzie, daj mi znać:

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;

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

questionAnswers(1)

yourAnswerToTheQuestion