Como obter elementos pelo nome no Delphi Chromium Embedded?
Para obter um nó DOM específico incorporado no documento da Web atual de uma instância TChromium, usando seu ID, use ICefDomDocument.getElementById (). Mas como você encontra elementos pelo atributo NAME? O Javascript tem o método document.getElementsByName () e o TWebBrowser (que envolve o IE) tem uma chamada semelhante, mas não consigo descobrir como fazer isso com o TChromium. Eu preciso encontrar alguns elementos DOM que possuem atributos NAME, mas não atributos de ID. Eu procurei oceflib unidade e não viu nada que faria isso.
Questão lateral. Se alguém tiver um link para um site ou documento de estilo "receitas" do TChromium, eu posso usá-lo.
ATUALIZAÇÃO: Enquanto espera por uma resposta eu criei o seguinte código para fazer getElementsbyName (). Eu gostaria de algo mais rápido do que escanear toda a árvore DOM. Se você ver algo errado no código, me avise:
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;
// ---------------------------------------------------------------