TWebbrowser: ID-lose Elemente anklicken

Bei einem aktuellen Projekt aus dem Bereich „Webautomatisierung“ musste das folgende Problem gelöst werden:

[Ausgangslage]
– Klicken von Tags
– anzuklickende Tags besitzen keine individuelle ID
– es existiert eine Tagliste, aus der der anzuklickende Tag ausgewählt werden muss
– anzuklickende Tags besitzen individuelle „innertext

[Vorgehensweise]

(1) Variablendeklaration
uses mshtml;
var ovElements, ovelements_1: OleVariant;

(2) Suchen und Klicken
ovElements_1 := WebBrowser1.OleObject.Document.all;
for j := 0 to (ovElements.Length - 1) do
if (ovElements_1.item(j).className = 'name') then
begin
if ovelements_1.item(j).innertext="wort" then
begin
ovElements_1.item(j).Click;
end;
end;

Weitere Infos:
TWebbrowser – Oledata

TWebbrowser: Einbindung und Arbeitsspeicherprobleme

Bei der Arbeit an den Webautomatismen entdeckte ich, dass der TWebbrowser enorm viel Arbeitsspeicher verbraucht. Das Problem lässt sich wie folgt lösen:

(1) Webbrowser – Prozess durchführen und auf Beendigung warten
(2) SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); in den Code einfügen

Bei einem konkreten Projekt wurde hierüber der durchschnittliche Verbrauch von ca. 650MB auf 60-80MB (schwankend) gedrückt.

Delphi: TWebbrowser – Formulare ausfüllen und „abschicken“

Für die Automatisierung mit Hilfe des TWebbrowser benötigt man den folgenden Code.
uses mshtml;

function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
i, j: Integer;
FormItem: Variant;
begin
Result := False;
//no form on document
if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
begin
Exit;
end;
//count forms on document
for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
begin
FormItem := WebBrowser.OleObject.Document.forms.Item(I);
for j := 0 to FormItem.Length - 1 do
begin
try
//when the fieldname is found, try to fill out
if FormItem.Item(j).Name = FieldName then
begin
FormItem.Item(j).Value := Value;
Result := True;
end;
except
Exit;
end;
end;
end;
end;


if FillForm(WebBrowser1, 'username', 'mein_username') = False then
Form1.caption:=version;

=> Ausfüllen des Formularfeldes „username“ mit dem Inhalt „Username“.
=> Ausweitbar auf weitere Formularfelder wie „passwort“, „webseite“ usw., sofern Objektnamen bekannt.
Webbrowser1.OleObject.document.forms.item(0).submit();
=> Ausgefüllte Inhalte werden abgeschickt

Delphi: Twebbrowser – Elemente (ohne ID) automatisch anklicken lassen

Bei einem unserer Projekte musste ich eine Lösung suchen, welche das Anklicken von Webseitenelementen erlaubt.
Vorausgesetzt, es handelt sich hierbei um einen „span“-tag, welcher einen eindeutigen (!) Namen trägt, gehe ich so vor:

var
ovElements: OleVariant;
i: Integer;


try
ovElements := WebBrowser1.OleObject.Document.all;
for i := 0 to (ovElements.Length - 1) do
if (ovElements.item(i).className = 'name') then
begin
try
ovElements.item(i).Click;
except
//fehlerbehandlung I
end;
end;
except
//fehlerbehandlung II => TEST
end;

Delphi: TWebbrowser – Version wechseln // festlegen

Im Normalfall muss man sich (leider) bei Delphi mit einer veralteten IExplorer-Version herum ärgern, wenn man Seiten wie bspw. Instagram aufrufen und „bearbeiten“ möchte.
Dieses Problem kann man nun so lösen:

uses registry

type
TIEMode = (iemIE7, iemIE8, iemIE10);

=> Vardeklaration
procedure SetWebbrowserMode(Mode: TIEMode; AppName: string = '');
const
REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
var
Reg: TRegistry;
Value: Integer;
begin
if AppName = '' then
AppName := ExtractFileName(Application.ExeName);
Case Mode of
iemIE7 : Value := $1B58;
iemIE8 : Value := $1F40;
iemIE10 : value := $2710;

end;
Reg := TRegistry.Create();
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(REG_KEY, True) then
begin
Reg.WriteInteger(AppName, Value);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;

=> Funktion für Browserversionswechsel
SetWebbrowserMode(iemIE10);
=> Browserversion auf IE10 setzen (Funktionsaufruf)