Instance d'objet WebBrowser

Résolu
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 13 août 2012 à 10:37
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 13 août 2012 à 17:30
Salut à tous.

Petite question, j'utilise un WebBrowser et j'y entre directement les informations de l'identifiant et mot de passe de la page html. Une fois chargée, la page Web s'ouvre sans soucis et bloque après avoir entré avec succès l'identifiant et le mot de passe.
Cela me renvoi cette exception :

"La référence d'objet n'est pas définie à une instance d'un objet."
sur la ligne suivante :
document.GetElementById("username").SetAttribute("value", "Admin");

Voici mon code.

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlDocument document = this.webBrowser1.Document;
            document.GetElementById("username").SetAttribute("value", "Admin");
            document.GetElementById("password").SetAttribute("value", "MonPass");
            document.GetElementById("login-form-submit").InvokeMember("click");


Merci d'avance

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas

6 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
13 août 2012 à 17:08
Tu ne peux pas ajouter un espion juste sur SetAttribute(xxxx)
Il faut le faire sur toute l'expression : document.GetElementById("username").SetAttribute("value", "Admin");
Mais je peux te garantir que si tu as une NullReferenceException sur cette ligne, c'est soit que document est null, soit qu'il ne trouve pas d'élément avec un id "username".
Il n'y a pas d'autre possibilité.

Si ton document n'est pas null et que tu veux voir l'ensemble des id des éléments dans ton document, tu peux ajouter ce code (avant la ligne qui plante) :
[code=cs]StringBuilder sb = new StringBuilder();
foreach (HtmlElement elt in document.All)
{
sb.Append(elt.Id).Append(" - ");
}
MessageBox.Show(sb.ToString());[code]
Ainsi, tu verras que tu n'as pas l'id "username" (attention à la casse).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
3
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
13 août 2012 à 10:46
A la limite, j'ai catcher pour passer l'erreur, mais je préférerais comprendre si possible :)

Merci.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
13 août 2012 à 11:57
Bonjour,

Es tu sur que les 3 id existent sur ta page et surtout qu'ils possèdent tous l'attribut value?
L'erreur laisse penser que tu essaies de modifier un élément ou un attribut qui n'existe pas.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
13 août 2012 à 14:46
Salut

"La référence d'objet n'est pas définie à une instance d'un objet."
signifie
"J'accède à un membre sur une référence nulle"
c'est-à-dire
"Je fais quelqueChoseDeNull.AutreChose"

Ton code est celui-ci :
document.GetElementById("username").SetAttribute("value", "Admin");

Tu as 2 ".", donc deux endroits qui peuvent être la source de l'exception :
- document
- document.GetElementById("username")

C'est à ça que sert le débugger de Visual Studio. Quand tu as l'exception, sélectionne "document", fais clic-droit => Add Watch (ajouter un espion en français, je crois). Tu verras si ça a une valeur ou si c'est null.
S'il n'est pas null, tu sélectionne document.GetElementById("username"), puis même procédure. Logiquement, si ce n'est pas document qui est null, ça ne peut qu'être le document.GetElementById("username").

Une fois que tu sais quel élément est null, à toi de voir pourquoi il l'est, et de corriger le problème (de mon côté, je pense que ton document ne contient tout simplement pas d'élément avec comme id "username").

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0

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

Posez votre question
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
13 août 2012 à 15:38
Salut L0ci, Salut Krimog,

Alors en ce qui concerne les "username" et "password" je suis certain qu'ils existent.
D’ailleurs les 2 se remplissent avec les valeur que je leurs donne via les 2 lignes suivantes :

document.GetElementById("username").SetAttribute("value", "Admin");
document.GetElementById("password").SetAttribute("value", "MonPass");

et quand je catch l’exception, tout fonctionne bien, je me suis bien logger sur le site.
ps : j'ai fait comme ceci "catch (NullReferenceException) { }"

Krimog, j'ai fais comme tu m'as dit, j'ai ajouter un espion, cela m'affiche sur cette ligne :

document.GetElementById("username").SetAttribute("value", "Admin");

"Le nom 'SetAttribute' n'existe pas dans le contexte.

Mais pourquoi cela se log quand même quand je met le catch ?
Merci d'avance.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
13 août 2012 à 17:30
Ok, bon j'ai mit l'espion sur document.GetElementById("username")

Il me renvoi bien "null" comme tu le pensais. Mais la je suis perdu. Tien le code HTML

<form method="post" action="?node=login" id="login-form">
<label for="username">Username</label>

<label for="password">Password</label>

<label for="language">Language</label>
<select name="ulang" id="language" /><option value="it_IT.UTF-8">it_IT.UTF-8</option>
<option value="en_US.UTF-8" selected="selected" >en_US.UTF-8</option>
<option value="es_ES.UTF-8">es_ES.UTF-8</option>
<option value="zh_CN.UTF-8">zh_CN.UTF-8</option>
</select>
<label for="login-form-submit"></label>

</form>


Et puis du coup je comprend vraiment pas pourquoi si je passe l'erreur , mes champs username et password se remplissent et la connexion au site ce fait parfaitement En tous cas merci pour l'espion c'est bien utile !

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0