IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

TWebBrowser : piloter un bouton de page web


Sujet :

Web & réseau Delphi

  1. #1
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut TWebBrowser : piloter un bouton de page web
    Bonjour,
    Novice dans le domaine, en cherchant à automatiser un calcul proposé sur un site en ligne, je parviens à remplir le formulaire avec mes valeurs mais pas à accéder au bouton que voici décrit :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <button class="success medium button" type="submit" data-attach-loading>Calculer</button>

    Ensuite se posera la question de télécharger le pdf produit : toute suggestion est bienvenue

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <fieldset>
        <form method="POST" action="https://www.xxx" accept-charset="UTF-8" target="_blank"><input name="_session_key" type="hidden" value="79ndjO5fE2aXyuLNC3zdRVWE11t"><input name="_token" type="hidden" value="cbi7bgv2hMyhqHz5mjJwk5d3wcxxkc">
        <input type="hidden" name="calculation-data" value="age=54&amp;sys_bp=154&amp;sex=m&amp;chol=5.4&amp;hdl=1%2C54&amp;smoker=yes&amp;diabetes=no">
        <div class="grid-x grid-margin-x">
            <div class="small-12 medium-4 cell">
                <label for="patientenname">Nom du patient (facultatif) :</label>
            </div>
            <div class="small-12 medium-4 cell">
                <input type="text" name="patientenname" id="patientenname">
            </div>
            <div class="small-12 medium-4 cell">
                <button type="submit" class="small primary button radius" data-attach-loading="">
                    Télécharger (PDF)
                </button>
            </div>
        </div>
    </fieldset>
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourquoi ne pas plutôt générer l'URL et faire le POST directement ?
    Un problème avec les cookies de session qui requiert le passage par le WebBrowser ?

    Le click sur un bouton, sur forum on a plein d'exemple via GetElementById et InvokeMember
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    J'y vais pas-à-pas, en découvrant le domaine.
    Passer par le WebBrowser me permet de vérifier au fur et à mesure mes actions.
    Pour le bouton "calculer", je n'ai pas réussi à le trouver car il n'a pas d'Id et sa classe ne permet pas la recherche. En listant les "button", je l'adresse par son index, mais c'est sale.
    Peut-être suffit-il de faire un 'Form.Submit' ? Et pour la seconde étape aussi, d'ailleurs : à essayer plus tard.
    Au besoin, je testerai aussi en générant l'URL.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Je reste sur l'obtention de la liste des boutons et l'action sur celui d'index voulu : ça fonctionne à défaut d'être propre.

    Par contre, cliquer sur le bouton "télécharger le pdf de résultat" ouvre une fenêtre Internet Explorer qui affiche une exception non gérée CSRF check failed.

    Il me reste à comprendre comment télécharger dans le WebBrowser ou à interroger le serveur avec des composants HTTP.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1 791
    Points : 5 755
    Points
    5 755
    Par défaut
    Bonjour,

    Je me joins à la conversation en cours parce que j'ai un problème en essayant de faire a peu près la même chose.

    Je veux faire un testeur (une App windows avec VCL) pour une plateforme web qui est développée au sein de mon entreprise. Idée: Afficher les pages avec Delphi est remplir de manière automatique des champs de saisie et activer des boutons.

    Je suis parti de l'exemple fourni avec Delphi 10.4 WebBrowser. Je dois afficher le site avec l'option "EdgeBrowser" (sinon, j'ai un message d'erreur indiquant qu'il y a erreur avec un script... A noter que cette erreur apparaît avec tous les sites internet tiers que j'ai testé sur le web, il y a donc un problème d'obsolescence avec TwebBrowser de Delphi 10.4, je suppose) et les pages se chargent parfaitement.

    J'essaie de remplir des champs et d'activer un bouton avec les exemples fournis sur le forum.

    Mais quand j'essaie par exemple de remplir un champ en cliquant sur un bouton avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebBrowser.OleObject.Document.GetElementByID('temperature1').setAttribute('value','34.08');
    J'ai un message d'erreur "Violation d'accès à l'adresse... dans le module Webrowser.exe"

    Idem si je veux activer un bouton avec un code du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    var
      Buttons: OleVariant;
      Button: OleVariant;
      I: Integer;
    begin
      Buttons := WebBrowser1.OleObject.Document.getElementsByClassName('marginBottom paddingInBox white');
      for I := 0 to Buttons.Length - 1 do
      begin
        Button := Buttons.item(I);
        if Button.innerText = 'demander le code de vérification' then
        begin
          Button.click();
          Break;
        end;
      end;
    end;

    Est-ce que le fait que le site soit du https et non du http peut être la raison de cette "Violation d'accès...? Mais j'en doute

    Est-ce que le composant WebBrowser doit avoir un statut particulier (du genre doit être en mode "édition") pour que cela fonctionne?

    Mes questions peuvent sembler très con mais j'avoue n'avoir jamais utilisé ce compo TWebBrowser...

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 131
    Points
    13 131
    Par défaut
    Citation Envoyé par Anselme45 Voir le message
    Afficher les pages avec Delphi est remplir de manière automatique des champs de saisie et activer des boutons.
    Et pourquoi ne pas piloter directement le navigateur par UIAutomation ?
    Perso je le fais pour préremplir une base de données de nouveaux articles en récupérant les informations depuis une page web (facture en ligne).

    Un exemple pour le champ de recherche de Chrome (Ctrl+F) : recherche du champ dans l'arborescence d'objets (FindFirstBuildCache), remplissage (SetValue) et action (Invoke).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    class procedure TChromeHelper.Search(const aText: string);
    begin
      const ChromeList = TWindow.FindAll(ChromeClass);
     
      if Length(ChromeList) = 0 then Exit;
     
      with UIA do
      begin
        var ChromeElement :IUIAutomationElement;
        var Element       :IUIAutomationElement;
        var CacheRequest  :IUIAutomationCacheRequest;
        var Conditions    :TArray<IUIAutomationCondition>;
     
        var ValuePattern  :IUIAutomationValuePattern;
        var InvokePattern :IUIAutomationInvokePattern;
        var Pt            :UIAutomationClient_TLB.tagPOINT;
        var Clickable     :integer;
     
        // Recherche un EditControl nommé "Rechercher" avec un FrameworkId vide.
        // Dans Chrome, un champ dans une page web aurait un FrameworkId = "Chrome".
        SetLength(Conditions, 4);
        CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_EditControlTypeId, Conditions[1]);
        CreatePropertyCondition(UIA_NamePropertyId, 'Rechercher', Conditions[2]);
        CreatePropertyCondition(UIA_FrameworkIdPropertyId, '', Conditions[3]);
        CreateAndConditionFromNativeArray(Conditions[1], High(Conditions), Conditions[0]);
     
        CreateCacheRequest(CacheRequest);
        CacheRequest.AddPattern(UIA_ValuePatternId);
        CacheRequest.AddPattern(UIA_InvokePatternId);
     
        for var Chrome in ChromeList do
          if Succeeded(ElementFromHandle(pointer(Chrome), ChromeElement)) and Assigned(ChromeElement) and
             Succeeded(ChromeElement.FindFirstBuildCache(TreeScope_Descendants, Conditions[0], CacheRequest, Element)) and Assigned(Element) and
             Succeeded(Element.GetClickablePoint(Pt, Clickable)) and boolean(Clickable) and // Est visible (cliquable) ?
             Succeeded(Element.GetCachedPattern(UIA_ValuePatternId, IInterface(ValuePattern))) and
             Succeeded(Element.GetCachedPattern(UIA_InvokePatternId, IInterface(InvokePattern))) then
          begin
            ValuePattern.SetValue(aText);
            InvokePattern.Invoke;
          end;
      end;
    end;
    Ca nécessite d' "Importer un composant" dans l'EDI : UIAutomationClient.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/11/2018, 11h30
  2. executer une action lors d'un click sur un bouton de page web
    Par clairetj dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/10/2013, 08h29
  3. Installer bouton sur page web vers iChat
    Par Kidkodak57 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 08/07/2012, 11h42
  4. Lancement d'une page web avec un bouton
    Par Elandril dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/03/2006, 21h08
  5. Comment Appuyer sur le bouton d'une page web...?
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/01/2005, 14h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo