2017-08-09 4 views
0

J'utilise le code suivant pour entrer un nom d'utilisateur et un mot de passe dans leurs champs respectifs sur un formulaire de connexion.TWebBrowser auto login

var 

Doc: IHTMLDocument2; 
I: Integer; 
Element: OleVariant; 
Elements: IHTMLElementCollection; 
Sub: Variant; 

begin 

Doc := WebBrowser1.Document as IHTMLDocument2; 
Elements := Doc.All; 
for I := 0 to Elements.length - 1 do begin 
Element := Elements.item(I, varEmpty); 

if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then begin 
if (Element.name = 'user') then Element.value := 'theusername'; 

if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then begin 
if (Element.name = 'passwrd') then Element.value := 'thepassword'; 
end; 
end; 
Sub := WebBrowser1.Document; 
Sub.frmLogin.Submit(); 
end; 
end; 

Infos sur les champs respectifs:

enter image description here enter image description here

Qu'est-ce qui se passe quand je lance le code:

enter image description here

Comme vous pouvez le voir, la partie nom d'utilisateur œuvres , le nom d'utilisateur est inséré. Le champ de mot de passe, cependant, ne fait pas.

Qu'est-ce que je fais mal?

+2

'UpperCase (Element.tagName) = 'input'' et la suivante ne regardez pas à droite -' UpperCase' a gagné' t match 'entrée' – BrakNicku

+0

@BrakNicku édité la question avec le code, une faute de frappe de ma part, désolé à ce sujet. Quoi qu'il en soit, cela ne fonctionne pas, avec ou sans majuscules et ainsi de suite, la même chose arrive. – Petzy

+1

seulement le premier (externe) 'IF' est vérifié chaque fois dans la boucle – BrakNicku

Répondre

2

Ceci est très difficile à voir avec le formatage de la question. Voici une copie de ce code avec - subjectivement - un meilleur formatage. Vous pouvez remarquer que le end; avant de faire quelque chose avec Webbrowser1. Ce sont les end; s de fermeture pour vos if s, ils sont donc imbriqués. Et le champ de mot de passe ne sera jamais trouvé car il ne correspond pas aux deux conditions. Bien que le formatage du code soit une question de goût, certaines choses peuvent vraiment aider à éviter les problèmes et rendre le code plus lisible.

Orginal reformaté:

var 
    Doc: IHTMLDocument2; 
    I: Integer; 
    Element: OleVariant; 
    Elements: IHTMLElementCollection; 
    Sub: Variant; 
begin 
    Doc := WebBrowser1.Document as IHTMLDocument2; 
    Elements := Doc.All; 
    for I := 0 to Elements.length - 1 do begin 
    Element := Elements.item(I, varEmpty); 

    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then 
    begin 
     if (Element.name = 'user') then Element.value := 'theusername'; 

     if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then 
     begin 
     if (Element.name = 'passwrd') then Element.value := 'thepassword'; 
     end; 
    end; 
    Sub := WebBrowser1.Document; 
    Sub.frmLogin.Submit(); 
    end; 
end; 

problème logique résolu:

var 
    Doc: IHTMLDocument2; 
    I: Integer; 
    Element: OleVariant; 
    Elements: IHTMLElementCollection; 
    Sub: Variant; 
begin 
    Doc := WebBrowser1.Document as IHTMLDocument2; 
    Elements := Doc.All; 
    for I := 0 to Elements.length - 1 do begin 
    Element := Elements.item(I, varEmpty); 

    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then 
    begin 
     if (Element.name = 'user') then 
     Element.value := 'theusername'; 
    end; 
    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then 
    begin 
     if (Element.name = 'passwrd') then 
     Element.value := 'thepassword'; 
    end; 
    Sub := WebBrowser1.Document; 
    Sub.frmLogin.Submit(); 
    end; 
end; 
+0

Me sert bien pour utiliser le code Internet et ne pas le vérifier et le mettre en forme à mon propre style. Merci, ça fonctionne. – Petzy

+2

Personnellement, j'utiliser 'IHTMLDocument3.getElementById()' ou 'IHTMLDocument3.getElementsByName()' pour trouver les éléments '', au lieu d'itérer 'Doc.all'. Ou mieux, trouvez l'élément '

' dans le document, obtenez son interface 'IHTMLFormElement', utilisez sa méthode' item() 'pour trouver les éléments' ', et appelez sa méthode' submit() 'directement sans passer par' '' Variante du tout. –

+0

@RemyLebeau Merci pour la suggestion! – Petzy