[C#] Message d'erreur dans un WebBrowser

Résolu
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016
- 12 juin 2014 à 12:04
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016
- 15 juin 2014 à 18:51
Bonjour à tous, j'ai une form1 avec un webBrowser, un bouton, et des textbox pour remplir un formulaire, j'aimerais savoir comment je peux afficher ( dans un label ou autre ) quand tu erreur apparaît dans mon webBrowser, car celui-ci est masquer, exemple j'ai l'ID de l'erreur sur le prénom ( firstNameFieldError )



Si le champ Prénom est vide ou incorrect et que cet erreur ( firstNameFieldError ) apparaît sur mon webBrowser, j'aimerais qu'il apparaisse aussi dans ma form1 voilà je sais pas si j'ai étais assez clair ou pas x)



Merci d'avance ^^

13 réponses

jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
12 juin 2014 à 12:08
je sais pas si j'ai étais assez clair ou pas
Ou pas...


Mais comme j'ai déjà suivi quelques unes de tes questions je pense savoir de quoi tu parles...

Donc : Dans ta page internet, lorsque tu remplis ton nom d'utilisateur (par exemple) apparait dans cette page un message d'erreur ( par exemple : nom d'utilisateur déjà utilisé....).
Ce que tu souhaites... c'est récupérer ce message pour l'afficher dans ta form.

Pour ce faire :
Tu regardes le code HTML de ce message d'erreur.
Il est surement contenu dans un DIV ...
Tu récupère donc, via l' ID de ce div son contenu...




0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

12 juin 2014 à 12:17
Oui voilà tu as parfaitement compris ce que je voulais dire x)

L'ID de l'erreur je l'ai déjà c'est celle que j'ai citer plus haut mais c'est le code que je ne connais absolument pas :x

http://prntscr.com/3s1srh
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
12 juin 2014 à 13:01
Il faut que tu utilises innerHTML
https://developer.mozilla.org/fr/docs/DOM/element.innerHTML

//Contenu de la balise <label id="account_loginNameFieldError'"  ..></label>
variable = document.getElementByid('account_loginNameFieldError').innerHTML;

A adapter avec le nom de tes variaaables bien entendu.
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

12 juin 2014 à 13:24
J'ai mis ceci mais il ne reconnait pas innerHTML :(

HtmlDocument document10 = this.webBrowser1.Document;
label6 = document10.GetElementById("account_loginNameFieldError").innerHTML;

Erreur1'System.Windows.Forms.HtmlElement' ne contient pas une définition pour 'innerHTML' et aucune méthode d'extension 'innerHTML' acceptant un premier argument de type 'System.Windows.Forms.HtmlElement' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)C:\Users\xxxx\desktop\test\test\Form3.cs
0
yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
12 juin 2014 à 13:27
Salut,

Tu peux utiliser le document HTML sous-jacent au WebBrowser:

// Récupère le document HTML
System.Windows.Forms.HtmlDocument doc =
        this.webBrowser1.Document;

// Pour un input
string valInput = doc.All["monInput"].GetAttribute("value");

//Pour un DIV :
string monDivText = doc.GetElementById("Mondiv").InnerText;
//ou 
string monDivText = doc.GetElementById("Mondiv").InnerHtml;


bye...
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
12 juin 2014 à 14:48
Et bien entendu,

Que tu utilises "ma" méthode, ou celle proposée par Yan....
Il faut, pour ne pas avoir d'erreur, vérifier que l'élément dont tu essayes de récupérer le contenu EXISTE sur la page.
Si tu mets un nom d'utilisateur VALIDE et qu'il n'y a pas de message d'erreur sur ta page web... l'élement Label contenant l'erreur normalement... n'existe pas...
Il est donc normal que tu ne puisse y lire sa valeur....


En javascript, pour vérifier qu'un élement existe on utilise Typeof.
var monElement = document.getElementById('id_de_mon_element');
if(typeof(monElement)!='undefined'){

//

}



0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

12 juin 2014 à 16:34
A mon avis ça doit être pour ça l'élément n'existe pas, j'ai essayer toutes les méthodes dites et malheureusement aucune ne fonctionne, il y'a un script assez long dans la page mais c'est entièrement du java je pense, voici un extrait :

$(document).ready(function(){
if($("#account_loginNameFieldInput, #account_loginNameField, #emailFieldInput").is(":focus")) {
showContextualHelp("#signInIdContextualHelp");
}

Comme j'y comprend rien au java je préfère laisse tomber, tant pis x)

Merci quand même à vous deux pour m'avoir accorder votre temps ^^
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
12 juin 2014 à 17:03
Voici comment vérifier si un élément existe

Dim element = webbrowser1.document.getelementbyid("block")
  if element isNot Nothing Then
    MsgBox(element.innerHTML)
  End if
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

12 juin 2014 à 22:39
Je laisse tomber c'est trop compliquer pour moi
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
Modifié par jordane45 le 13/06/2014 à 01:22
Désolé... quand j'ai posté ma réponse précédente... je te l'ai mis en VB.net... au lieu de C#

Donc ça donnerait quelque chose de ce genre :


HtmlElement elmt = webBrowser1.document.getelementbyid("account_loginNameFieldError");
  if (elmt !=null){
    // récupération de la valeur de ton élément html
     srting mavaleur = elmt.innerHTML;

 }


L'autre possibilité... c'est de tout simplement metter la récupération de ton champ dans un bloc TRY CATCH....
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

Modifié par Ulrichleboss le 13/06/2014 à 01:05
Mec, t'est juste un dieu :D en trafiquant un peu le code j'ai réussi :D

Bon ça récupère pas la valeur mais ça m'affiche le message d'erreur, y'a pas de value dans le code HTML pour cet ID.

M'enfin ça fonctionne quand même ^^

Si j'étais à coté de toi j'te ferais un gros calin xD
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:06
Si justement il doit m'afficher le message si la case est vide, c'est bien pour ça que j'ai voulu ce code ^^

Quand je lance le formulaire avec toutes les cases vides, j'ai une case visible du webBrowser, et on la voit bouger donc le message d'erreur apparaît bien sur la page mais pas dans mon tool et si je reclique pour lancer le formulaire, là j'aurais les messages d'erreur, par contre la date de naissance est entrer correctement et il m'affiche quand même tout les messages, par contre si le nom est entrer et que le reste non, là il n'affiche aucune erreur nul part.

Sa ne viendrais pas de mon code par hasard ?

HtmlElement elmt = webBrowser1.Document.GetElementById("account_loginNameFieldError");
if (elmt != null)
{
string mavaleur = elmt.InnerHtml;
MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
HtmlElement elmt1 = webBrowser1.Document.GetElementById("dropDownGroupError");
if (elmt != null)
{
string mavaleur = elmt1.InnerHtml;
MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

etc pour les autres erreurs c'est la même chose
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 14:11
Si ... ça vient de ton code !

  HtmlElement elmt1 = webBrowser1.Document.GetElementById("dropDownGroupError");
            if (elmt != null)

elmt => n'est pas elmt1
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:13
Aie l'erreur bête de ma part j'avais pas vu ! :o
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:13
Je vais tester ça tout de suite !
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:15
Après test ça na rien changer enfaite x)

J'ai toujours les mêmes erreurs :x
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:16
Sa serait pas la disposition du code ? ça prend la méthode if donc il prend le 1er et si le premier " if " est activer il ne regarde pas les autres ?
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 14:19
J'ai toujours les mêmes erreurs :x

Qu'est ce que tu entends par : les mêmes erreurs ?

As-tu essayé de mettre des points d'arrêt dans ton programme pour essayer de comprendre pourquoi ça te faisait ça ?
Qu'est ce déclenche ces erreurs ?

Je te rappelle également que la plus part des scripts présents sur ta page html... se déclenchent après changement de FOCUS des éléments....


0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:28
Même après avoir changer les nom des elmt, j'ai toujours la même chose si la 1er erreur ne s'affiche pas, les autres erreurs ne s'afficheront pas, je ne pense pas que les script joue un rôle là dessus puisque sur la page webBrowser les erreurs s'affichent correctement, mais pas sur mon tool, des points d'arrêts kézako ?

Je me demande si c'est pas en rapport avec le code, ça pourrait correspondre :

Il ne m'affiche pas les erreurs si il n'y à pas d'erreur dans la première case, et si il m'affiche la 1er erreur, il va m'afficher les autres erreurs même si il n'y en à pas sur la page.

Le ''if'' ne serait il pas la cause de mon problème ?
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 14:38
Tu peux me montrer le code exact entier ?
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 14:55
Yep le voilà

private void metroButton2_Click(object sender, EventArgs e)
{
HtmlElement elmt = webBrowser1.Document.GetElementById("account_loginNameFieldError");
if (elmt != null)
{
string mavaleur = elmt.InnerHtml;
MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
HtmlElement elmt1 = webBrowser1.Document.GetElementById("dropDownGroupError");
if (elmt1 != null)
{
string mavaleur = elmt1.InnerHtml;
MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
HtmlElement elmt2 = webBrowser1.Document.GetElementById("confirmPasswordFieldError");
if (elmt2 != null)
{
string mavaleur = elmt2.InnerHtml;
MessageBox.Show("Veuillez confirmez le mot de passe", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
HtmlElement elmt3 = webBrowser1.Document.GetElementById("recaptcha_response_fieldFieldError");
if (elmt3 != null)
{
string mavaleur = elmt3.InnerHtml;
MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

HtmlDocument document7 = this.webBrowser1.Document; document7.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
HtmlDocument document5 = this.webBrowser1.Document; document5.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
HtmlDocument doc = this.webBrowser1.Document;
object[] args = { textBox1.Text, "account_password" };
doc.InvokeScript("validatePasswordAJAX", args);
webBrowser1.Document.GetElementById("createAccountButton").InvokeMember("click");
}
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
Modifié par jordane45 le 13/06/2014 à 15:42
Tiens...

J'ai fais un peu de ménage...

Dis moi ce que ça donne :

private void metroButton2_Click(object sender, EventArgs e)
        {
            
   // DOcument HTML (on ne le déclare qu'une fois..ça suffit...
   HtmlDocument docHTML  = this.webBrowser1.Document;
   
   // Récupération des différents élements de la page:
   HtmlElement elmt  = docHTML.GetElementById("account_loginNameFieldError");
   HtmlElement elmt1 = docHTML.GetElementById("dropDownGroupError");
   HtmlElement elmt2 = docHTML.GetElementById("confirmPasswordFieldError");
   HtmlElement elmt3 = docHTML.GetElementById("recaptcha_response_fieldFieldError");

     if (elmt != null){
               MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
           
            if (elmt1 != null){
               MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
          
            if (elmt2 != null){
               MessageBox.Show("Veuillez confirmez le mot de passe", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
            if (elmt3 != null){
              MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

   docHTML.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
   docHTML.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
           
             object[] args = { textBox1.Text, "account_password" };
             docHTML.InvokeScript("validatePasswordAJAX", args);
   
   // Si aucun élément ne manque :
   if   (elmt != null 
     && elmt1 != null 
     && elmt2 != null 
     && elmt3 != null){
                docHTML.GetElementById("createAccountButton").InvokeMember("click");
   }
        }


Edit : correction : retrait des " .Document" en trop dans la déclaration des variables.


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

Modifié par Ulrichleboss le 13/06/2014 à 15:36
Wahou quel vide x)

Par contre il ne se passe rien du tout, quand je clique sur mon bouton pour envoyer la page rien ne se passe, du tout x)

J'ai du modifier le code en enlevant le mot " Document " sur cette partie du code
 // Récupération des différents élements de la page:
HtmlElement elmt = docHTML.GetElementById("account_loginNameFieldError");
HtmlElement elmt1 = docHTML.Document.GetElementById("dropDownGroupError");
HtmlElement elmt2 = docHTML.Document.GetElementById("confirmPasswordFieldError");
HtmlElement elmt3 = docHTML.Document.GetElementById("recaptcha_response_fieldFieldError");

Car il afficher une erreur en me disant que :

Erreur 1 'System.Windows.Forms.HtmlDocument' ne contient pas une définition pour 'Document' et aucune méthode d'extension 'Document' acceptant un premier argument de type 'System.Windows.Forms.HtmlDocument' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 15:39
Ca c'est peut être mon IF de la fin.
   // Si aucun élément ne manque :
   if   (elmt != null 
     && elmt1 != null 
     && elmt2 != null 
     && elmt3 != null){
                docHTML.GetElementById("createAccountButton").InvokeMember("click");
   }

si tu le retires et que tu ne gardes que :
    docHTML.GetElementById("createAccountButton").InvokeMember("click");

ça donne quoi ?
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 15:40
Ah oui...
J'ai du modifier le code en enlevant le mot " Document " sur cette partie du code
Bien vu... erreur de copier coller
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 15:58
Si j'enlève le If de la fin il me demande de mettre un " ; " à la fin de
(elmt != null 
&& elmt1 != null
&& elmt2 != null
&& elmt3 != null)

Si je le fais il me sors cette erreur : http://prntscr.com/3sec9g
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
Modifié par jordane45 le 13/06/2014 à 16:08
C'est par ce que tu as oublié de retirer un "}"
EDIT : Quand je dis retirer le IF .. c'est TOUT le bloc de test...
pas que le mot "if" ^^

Testes ce code :

private void metroButton2_Click(object sender, EventArgs e)
        {
            
   // DOcument HTML (on ne le déclare qu'une fois..ça suffit...
   HtmlDocument docHTML  = this.webBrowser1.Document;
   
   // Récupération des différents élements de la page:
   HtmlElement elmt  = docHTML.GetElementById("account_loginNameFieldError");
   HtmlElement elmt1 = docHTML.GetElementById("dropDownGroupError");
   HtmlElement elmt2 = docHTML.GetElementById("confirmPasswordFieldError");
   HtmlElement elmt3 = docHTML.GetElementById("recaptcha_response_fieldFieldError");

     if (elmt != null){
               MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
           
            if (elmt1 != null){
               MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
          
            if (elmt2 != null){
               MessageBox.Show("Veuillez confirmez le mot de passe", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
            if (elmt3 != null){
              MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

   docHTML.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
   docHTML.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
           
             object[] args = { textBox1.Text, "account_password" };
             docHTML.InvokeScript("validatePasswordAJAX", args);
 // Si aucun élément ne manque :
 //  if   (elmt != null 
 //    && elmt1 != null 
 //     && elmt2 != null 
 //     && elmt3 != null){
                docHTML.GetElementById("createAccountButton").InvokeMember("click");
   //}
 }

0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 16:33
Je pense qu'il faut invoker le script de password...avant de vérifier.


private void metroButton2_Click(object sender, EventArgs e)
        {
 
//-------------------------------------------
// Initialisation de l'élément : Document
//-------------------------------------------           
   // Document HTML (on ne le déclare qu'une fois..ça suffit...
   HtmlDocument docHTML  = this.webBrowser1.Document;
   
//-------------------------------------------
// Mise à jour des champs :
//-------------------------------------------
   docHTML.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
   docHTML.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
     object[] args = { textBox1.Text, "account_password" };
      docHTML.InvokeScript("validatePasswordAJAX", args);

//-------------------------------------------
// Vérification du message(s) d'erreur(s)
//-------------------------------------------
   // Récupération des différents élements de la page:
   HtmlElement elmt  = docHTML.GetElementById("account_loginNameFieldError");
   HtmlElement elmt1 = docHTML.GetElementById("dropDownGroupError");
   HtmlElement elmt2 = docHTML.GetElementById("confirmPasswordFieldError");
   HtmlElement elmt3 = docHTML.GetElementById("recaptcha_response_fieldFieldError");

     if (elmt != null){
               MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
           
            if (elmt1 != null){
               MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
          
            if (elmt2 != null){
               MessageBox.Show("Veuillez confirmez le mot de passe", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
            if (elmt3 != null){
              MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

//-------------------------------------------
// Click sur le bouton Valider dans le navigateur
//-------------------------------------------
           
 // Si aucun élément ne manque :
 //  if   (elmt != null 
 //    && elmt1 != null 
 //     && elmt2 != null 
 //     && elmt3 != null){
 
          docHTML.GetElementById("createAccountButton").InvokeMember("click");

 //}
 }


0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 17:15
J'ai tester ça na rien changer apparemment l'ordre du script n'a pas d'importance
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
Modifié par jordane45 le 13/06/2014 à 17:28
Bon,
Déjà... pour éviter d'avoir a réécrire 50 fois le même code... j'ai ajouté une fonction qui fait la vérification des champs.

      public bool IsExistHtmlElement(string elmID) 
        {
            bool result = false;
            HtmlDocument docHTML = this.webBrowser1.Document;
            HtmlElement elmt = docHTML.GetElementById(elmID);
            if (elmt != null)
            {
                result = true;
            }
            return result;
        }

        private void button2_Click(object sender, EventArgs e)
        {

            bool isError = false;
            //-------------------------------------------
            // Initialisation de l'élément : Document
            //-------------------------------------------           
            HtmlDocument docHTML = this.webBrowser1.Document;

            //-------------------------------------------
            // Mise à jour des champs :
            //-------------------------------------------
            docHTML.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
            docHTML.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
            object[] args = { textBox1.Text, "account_password" };
            docHTML.InvokeScript("validatePasswordAJAX", args);

            //-------------------------------------------
            // Vérification du message(s) d'erreur(s)
            //-------------------------------------------
            if (IsExistHtmlElement("account_loginNameFieldError"))
            {
                MessageBox.Show("Veuillez saisir une adresse mail", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                isError = true;
            }
            if (IsExistHtmlElement("dropDownGroupError"))
            {
                MessageBox.Show("Veuillez saisir une date de naissance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                isError = true;
            }
            if (IsExistHtmlElement("confirmPasswordFieldError"))
            {
                MessageBox.Show("Veuillez confirmez le mot de passe", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                isError = true;
            }
            if (IsExistHtmlElement("recaptcha_response_fieldFieldError"))
            {
                MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                isError = true;
            }

            //-------------------------------------------
            // Click sur le bouton Valider dans le navigateur
            //-------------------------------------------

            if (! isError)
            {
                MessageBox.Show("Veuillez saisir les caractères affichés sur l'image.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                docHTML.GetElementById("createAccountButton").InvokeMember("click");
            }
            else
            {
                MessageBox.Show("Il y a une ou plusieurs erreurs", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



Pour ce qui est de ton souci..... => L'affichage des messages d'erreur qui ne se fait que si tu cliques une deuxième fois sur le bouton.....il faut qu'on creuse un peu plus...




Si tu mets un point d'arrêt sur la ligne de code :
 bool isError = false;

Est ce que lorsque ton script arrive sur ce point d'arrêt... les messages d'erreur DANS TON NAVIGATEUR sont présents ?


mets un autre point d'arrêt sur la ligne de code :
   if (! isError)

Et là ... est ce que les messages d'erreurs dans ton navigateur sont là ?


Et enfin... une fois que le code a fini de s'exécuter...
Est-ce que les messages d'erreurs DANS TON NAVIGATEUR toujours.. apparaissent ??


Et... as tu des MsgBox qui s'affichent ?


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

Modifié par Ulrichleboss le 13/06/2014 à 17:51
Alors, avec le code complet que tu ma donner, quand j'ouvre le programme, et que je clique sur Envoyer ( tout les champs sont vides à la base ), il m'affiche un messagebox me disant de remplir le captcha, quand je regarde le webBrowser, il me dit que tout les champs à part le captcha que j'ai remplis, sont vides, mais il ne m'affiche aucun autre messagebox. Et le message s'affiche dès le 1er clique et non plus au bout du deuxième.
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 18:02
Donc c'est bon ou pas ?
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 18:06
Non :x le message s'affiche alors que le captcha est remplis, et aucun autre messages ne s'affiche alors que tout les autres champs sont vides :s
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 18:15
Est ce que tu as regardé dans le code source de la page web si ces éléments sont présents dans la PAGE même si les champs ne sont pas remplis ??
Pas si il y a un message dedans...mais bien si le "conteneur" existe ?
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 18:26
Je viens de regarder et le conteneur n'existe pas :x le code est manquant , il n'apparaît que quand il y'a l'erreur :x
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 18:34
Tu peux tester ceci ?


public bool IsExistHtmlElement(string elmID) 
        {
            bool result = false;
            HtmlDocument docHTML = this.webBrowser1.Document;
            HtmlElement elmt = docHTML.GetElementById(elmID);
            if (elmt != null)
            {
                result = true;
 MessageBox.Show("L'élément "+ elmID + existe et contient : " + elmt.innerHTML , "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            

            }
            return result;
        }





Et .... as tu essayé en mode pas à pas après avoir mis les points d'arrêt comme je te l'ai demandé ??

0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

13 juin 2014 à 18:51
En pas à pas détaillé : http://prntscr.com/3sfy2m

Et en pas à pas principal c'est la même chose
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
Modifié par jordane45 le 13/06/2014 à 18:57
Petit oublie d'apostrophe...

public bool IsExistHtmlElement(string elmID) 
        {
            bool result = false;
            HtmlDocument docHTML = this.webBrowser1.Document;
            HtmlElement elmt = docHTML.GetElementById(elmID);
            if (elmt != null)
            {
                result = true;
            string elmValue = elmt.innerHTML;
            MessageBox.Show("L'élément " + elmID +  " existe et contient : " + elmValue , "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            

            }
            return result;
        }
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

Modifié par Ulrichleboss le 13/06/2014 à 19:11
J'ai corriger, quand je clique sur mon 1er bouton pour remplir l'account + la date de naissance et que je clique sur " Envoyer " il me sort un messagebox : L'élément account_loginNameFieldErrror existe et contient : Veuillez saisir une adresse e-mail.

Je clique sur OK pour fermer le message, et un deuxième s'ouvre juste après disant : Veuillez saisir une adresse mail.

Je clique OK il met le même message que le 1er lais au lieu de account_loginNameFieldError, c'est dropDownGroupError existe et contient : Veuillez saisir une date de naissance.

La même chose pour les autres éléments, et à la fin j'ai le message " Il existe une ou plusieurs erreurs "

Mais il aurait pas du s'afficher pour la date de naissance, car elle y était, et pareil pour l'adresse mail :x
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
13 juin 2014 à 19:30
Attend.... si pour la date de naissance tu as les msgbox qui apparaissent... c'est que l'élément est présent sur ta page WEB...

Comme quoi TON programme fonctionne bien... maintenant il ne reste plus qu'à comprendre le fonctionnement du site web.......


Donc... il faut regarder (directement sur le site web.... sans passer par ton soft )
Le code source de la page au niveau de la date de naissance : Le conteneur existe t'il déjà dans la page alors que tu n'y a encore rien saisi ?
Ensuite si tu saisies quelque chose... le conteneur est il toujours là ?

Regardes aussi si il n'y aurait pas un javascript pour la date ....

et au passage... redonnes nous le lien du PSN que j'essaie de regarder le code source du site voir si je trouve quelquechose
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

Modifié par jordane45 le 13/06/2014 à 20:03
Voici le lien : https://account.sonyentertainmentnetwork.com/reg/account/create-account!input.action?service-entity=psn

Par contre quand une erreur apparaît le lien change, il y'a un javascript pour la date mais c'est un script pour les couleur de texte uniquement, mon webBrowser démarre sur cette page, ensuite dès qu'il y'a une erreur il passe sur la deuxième page qui elle apparemment contient les erreurs, si je fais démarrer mon webBrowser sur la page d'erreur directement est-ce que sa réglerais certain problème ?
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
14 juin 2014 à 03:35
Reprenons....

Peux tu me dire si tu as mis des points d'arrêt et si tu as testé ton code en mode pas à pas ?
http://loulou.developpez.com/tutoriels/cpp/debogueur-visual-studio/#L3.3

Pour ce qui est de la sortie (output).
N'as tu pas dans cette feneêtre une liste déroulante du genre :



Pour ce qui est de ton souci.... il faudrait peut être regarder du côté de la temporisation.
en effet...(Sur le site) entre le moment où tu cliques sur le bouton valider du site et celui où apparaissent les messages (sur un autre lien).. il peut y avoir quelques millisecondes (voir quelques secondes...)

J'aimerai aussi que tu m'expliques pourquoi tu as deux boutons et à quoi ils servent (et comment tu t'en serts..)

D'après ce que je crois comprendre :
Le bouton 1 te sert à renseigner TOUS les champs
Puis "cliques" sur le bouton valider.

Le bouton 2 : Vérifie s'il y a des messages d'erreur puis s'il n'y en a pas ..."cliques" sur valider ?
Donc tu te trouves bien sur la page contenant les erreurs AVANT de cliquer sur le bouton 2 ?




Autre point :
Autant.. pour certaines vérifications faites par le site tel que le captcha et le login ( vérifications faites via des scripts javascript sur la page) je comprend que tu veuilles récupérer les erreurs de la page....
Autant pour les autres champs je ne comprend pas que tu ne fasses pas la vérification toi-même directement dans ton programme....
La case est vide ? ...erreur il faut la renseigner..... et ça.. nul besoin d'aller demander au site web de te le dire.....

Penses que là... tu es en train de manipuler un logiciel (internet explorer) à travers TON programme.... et donc...ça alourdit forcément les choses..

Pour faire une analogie :
C'est un peu comme moi qui suit en train de te dire comment modifier ton programme.... il risque d'y avoir des loupés à un moment où à un autre et ça sera plus lent... (plus que si c'était moi qui codait directement)...

Donc pour résumer :
Tout ce qui peut être traité directement par TON programme doit l'être...et tu réserves les manipulation du site web à ce qui est indispensable.

Dans le principe :
1 - Tu fais remplir par tes utilisateurs les champs (tes textbox)

2 - Tu vérifies que tous les champs obligatoires sont bien remplis

3 - si oui... tu cliques sur le bouton valider du site web
3 bis - Sinon.. retour étape 1

4 - Tu attends que la page soit rechargée...

5 - Tu vérifie s'il y a des messages d'erreur

6 - Si il y a des erreurs : Retour à l'étape 1
6 bis - Sinon ...ben... ton compte est créé..



0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

14 juin 2014 à 10:36
Bonjour à toi !

Alors points d'arrêts je ne sais pas ou les placer précisement, et quand je lance le programme en pas à pas visual studio plante, la fenêtre d'output sortie la voilà : http://prntscr.com/3snqao et comme je te l'ai dit plus haut y'a marquer ce genre de chose, pour les champs qui sont vides c'est vrai qu'il serait bien plus de le faire faire par le programme et non pas par le webbrowser, je vais me pencher à des corrections pour ça !

Mon bouton 1 me permet de préremplir des champs en voici le code :
HtmlDocument document1 = this.webBrowser1.Document; document1.GetElementById("account_loginNameFieldInput").SetAttribute("value", richTextBox1.Text);
HtmlDocument document2 = this.webBrowser1.Document; document2.GetElementById("dayDropDown").SetAttribute("value", comboBox1.Text = "1");
HtmlDocument document3 = this.webBrowser1.Document; document3.GetElementById("monthDropDown").SetAttribute("value", comboBox2.Text = "1");
HtmlDocument document4 = this.webBrowser1.Document; document4.GetElementById("yearDropDown").SetAttribute("value", comboBox3.Text = "1950");

Et mon bouton 2 me permet de valider le password, invoquer le javascript et confirmer le captcha, plus cliquer le bouton d'envoie de la page.

J'ai un 3ème bouton mais lui fonctionne de la même façon que le 1er, sauf qu'au lieu de préremplir avec des mot déjà prêt, il permet de mettre les mot que l'on veux dans une textbox puis de les envoyer vers le formulaire : Textbox remplis par utilisateur + le captcha et javascript + envoie :

HtmlDocument document1 = this.webBrowser1.Document; document1.GetElementById("account_loginNameFieldInput").SetAttribute("value", richTextBox1.Text);
HtmlDocument document2 = this.webBrowser1.Document; document2.GetElementById("dayDropDown").SetAttribute("value", comboBox1.Text);
HtmlDocument document3 = this.webBrowser1.Document; document3.GetElementById("monthDropDown").SetAttribute("value", comboBox2.Text);
HtmlDocument document4 = this.webBrowser1.Document; document4.GetElementById("yearDropDown").SetAttribute("value", comboBox3.Text);
HtmlDocument document7 = this.webBrowser1.Document; document7.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
HtmlDocument document5 = this.webBrowser1.Document; document5.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
HtmlDocument doc = this.webBrowser1.Document;
object[] args = { textBox1.Text, "account_password" };
doc.InvokeScript("validatePasswordAJAX", args);
webBrowser1.Document.GetElementById("createAccountButton").InvokeMember("click");
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

14 juin 2014 à 11:02
J'ai modifié le code :

private void metroButton2_Click(object sender, EventArgs e)
{
{
//-------------------------------------------
// Initialisation de l'élément : Document
//-------------------------------------------
HtmlDocument docHTML = this.webBrowser1.Document;
//-------------------------------------------
// Mise à jour des champs :
//-------------------------------------------
docHTML.GetElementById("confirmPasswordField").SetAttribute("value", textBox1.Text);
docHTML.GetElementById("recaptcha_response_field").SetAttribute("value", textBox2.Text);
object[] args = { textBox1.Text, "account_password"};
docHTML.InvokeScript("validatePasswordAJAX", args);

if (richTextBox1.Text.Trim() == "")
{
MessageBox.Show("Veuillez saisir une adresse mail.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (comboBox1.Text.Trim() == "Jour")
{
MessageBox.Show("Veuillez saisir le jour de votre date de naissance.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (comboBox2.Text.Trim() == "Mois")
{
MessageBox.Show("Veuillez saisir le mois de votre date de naissance.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (comboBox3.Text.Trim() == "Année")
{
MessageBox.Show("Veuillez saisir l'année de votre date de naissance.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (textBox1.Text.Trim() == "")
{
MessageBox.Show("Veuillez confirmer le mot de passe.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (textBox2.Text.Trim() == "")
{
MessageBox.Show("Veuillez saisir le CAPTCHA.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

//-------------------------------------------
// Click sur le bouton Valider dans le navigateur
//-------------------------------------------

if (richTextBox1 != null
&& comboBox1 != null
&& comboBox2 != null
&& comboBox3 != null
&& textBox1 != null
&& textBox2 != null)
{
docHTML.GetElementById("createAccountButton").InvokeMember("click");
}
}
}

Ca fonctionne mais y'a un truc qui me gêne ça devrais pas cliquer sur le bouton "createAccountButton" si y'a un champs qui est vide non ? pourtant dans mon cas ça le fais.
0
jordane45
Messages postés
35830
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 juillet 2022
358
15 juin 2014 à 00:45
C'est ton IF qui ne va pas.
 if (richTextBox1 != null
                        && comboBox1 != null
                        && comboBox2 != null
                        && comboBox3 != null
                        && textBox1 != null
                        && textBox2 != null)
                {

Tes objets ( textbox..combo..) ne sont pas NULL... par contre leurs valeurs sont "vides"

Ca devrait être mieux comme ça :
 if (richTextBox1.Text <>""
                        && comboBox1.Text<>""
                        && comboBox2.Text<>""
                        && comboBox3.Text<>""
                        && textBox1.Text<>""
                        && textBox2.Text<>"")
                {
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

15 juin 2014 à 10:03
Euh non enfaite la j'ai 21 erreurs x), je vais essayer de changer le code pour enlever les erreurs

http://prntscr.com/3sz5m3
0
Ulrichleboss
Messages postés
502
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
14 mai 2016

15 juin 2014 à 18:51
En adaptant le code j'ai réussi ^^

Merci à toi sujet clos !!!
0