¿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;
// ---------------------------------------------------------------