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

VB.NET Discussion :

Interaction Site Web/VB.Net


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Par défaut Interaction Site Web/VB.Net
    Bonjour à tous,
    Je vous expose tout de suite mon projet afin de clarifier au maximum les choses et de simplifier votre compréhension de mon problème
    J'essaie de développer une sorte de "bot" pour Pinterest, assez simple qui "re-pinnerai" les images automatiquement.
    Pour ceux qui ne sont pas familier avec ce site, il s'agit d'un réseau social orienté images, images que les utilisateurs "pin", équivalent du "partage" Facebook.
    J'étais donc à la recherche de la meilleur façon de faire interagir mon programme avec le site web et j'ai fini par trouver la méthode du getElementById.
    Cette méthode me semble la plus simple mais dés le début, je me trouve face à un petit problème
    Si j'ai bien compris, cette méthode utilise le "name = ..." plutôt que "id = ..." ? Voilà ce que cela donne pour la phase de login qui se fait ici.
    Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WebBrowser1.Navigate("www.pinterest.com/login")
     WebBrowser1.Document.GetElementById("username_or_email").SetAttribute("value", TextBox1.Text)
     WebBrowser1.Document.GetElementById("password").SetAttribute("value", TextBox2.Text)
     WebBrowser1.Document.GetElementById("problème ici :(").InvokeMember("click")
    Le problème se situe au niveau du bouton : en fouillant dans le code source, je ne parviens pas à trouver le "name = ..." il y a certes un "id=..." mais je ne semble pas pourvoir l'utiliser avec cette méthode. En effet, lorsque j'essaie de mettre en argument "Button-9" de "id= Button-9", l'exception suivante apparait : System.NullReferenceException
    Voici le code source se trouvant aux environs de la login form :
    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
     
                            <ul class="userLogin">
                    <li class="loginUsername">
                        <input autofocus class="email" 
                            type="email" 
                            name="username_or_email" 
                            placeholder="E-mail" 
                            autocomplete="on"/>
                                        </li>
                    <li class="loginPassword">
                        <input type="password" 
                            name="password" 
                            placeholder="Mot de passe"/>
                    </li>
                </ul>
                        <div class="businessHint">
            Vous êtes un professionnel ? <a href="http://www.pinterest.com/_/_/business"
     
                    target="_blank"        
        >Cliquez ici pour commencer</a>    </div>
            <div class="loginError"></div>
     
        <div class="formFooter">
     
                    <div class="formFooterButtons">
                        <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">    
     
     
    <span class="buttonText">Se connecter</span>
            </button>
                    </div>
    Dois-je continuer avec cette méthode où y en a-t-il une plus simple/efficace ?
    Je vous remercie d'avance de votre réponse et si vous avez des questions, n'hésitez pas
    Bonne soirée

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Peut-être que le contenu qui t'intéresse est chargé de façon asynchrone.

    Pour en être sûr essaye de dumper le document juste avant de faire le GetElementById.
    Il y a de fortes chances pour que l'élément avec l'ID que tu recherches n'y soit pas encore.

  3. #3
    Membre habitué
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Par défaut
    Merci de ta réponse mais finalement je vais plutôt le faire en utilisant HTTPWebRequest je pense
    Cependant ça m'intéresse quand même de savoir comment j'aurais pu résoudre ce problème et je ne comprends pas très bien ta réponse, qu'entends-tu par "dumper" le document ?

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Si c'est bien le problème que je décris alors utiliser HttpWebRequest ne pourra qu'être pire.

    En effet beaucoup de pages web chargent leur contenu de façon asynchrone :
    - il y a une page de base avec du markup et du code JavaScript
    - quand cette page de base est chargée le code JavaScript est exécuté
    - il récupère via AJAX des données depuis le serveur et modifie la page pour arriver au rendu final
    - plus tard il peut encore récupérer des données et remodifier la page.

    Donc avec une HttpWebRequest tu n'auras que la page de base.
    Pour avoir le reste il faut pouvoir exécuter du JavaScript => il faut un navigateur comme le WebBrowser.
    Mais il faut alors attendre suffisamment longtemps que tout soit chargé : tu peux checker à intervalle régulier le DOM par exemple.

    Si tu veux vérifier mon hypothèse c'est simple :
    • accède à la page avec ton navigateur favori
    • affiche le code source original de la page ("View page source" sous Chrome)
    • cherche ton élément avec son id dedans :
      • tu le trouves : c'est parfait, tu vas pouvoir utiliser simplement HttpWebRequest (ou plus simple encore la classe WebClient)
      • tu ne le trouves pas : ça va être plus compliqué...

  5. #5
    Membre habitué
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Par défaut
    Donc en trouvant mon bouton dans le code source j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                 <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">    
     
     
    <span class="buttonText">Se connecter</span>
            </button>
    Ça me semble donc possible d'utiliser HTTPWebRequest ou WebClient ? Ou du moins faire quelque chose avec l'id "Button-9" ?
    Dans le pire des cas, je pourrais utiliser la simulation de touches("tabulation" et "enter") pour me connecter mais je préférerai comprendre et faire avec les méthodes citées plus haut
    En tout cas, merci de ton aide

    EDIT:
    Enfait, je crois comprendre ce qu'il se passe, peut-être c'est le phénomène d'asynchronisme que tu abordais.
    J'ai remarqué que lorsque je recharge la page, le boutton de connexion est "rouge", activé, mais au moment où je clique ailleurs, il devient "gris", désactivé.
    Cela se répercute probablement dans le code source car lorsque la page est "fraiche" et que le bouton est activé, l'Id de ce dernier est visible mais lorsqu'il devient désactivé et que je clique droit, inspecter l'élément,
    l'Id n'est plus disponible.
    Bouton activé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">
    Bouton désactivé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <button type="submit" class="rounded Button primary Module large hasText btn disabled" disabled="">
    C'est probablement pour cela que le programme n'est pas en mesure de récupérer l'Id, je vais essayer de modifier mon code pour valider mon hypothèse
    REEDIT :
    Ça ne marche pas non plus

  6. #6
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir à tous,

    Le débat est intéressant mais à chaque méthode ses outils :

    Si tu veux utiliser un webbrowser alors tu analyses le contenu de la page (code source).

    Si tu veux utiliser les webrequests alors il faut analyser les requêtes avec un outil car comme le dit Pragmateek plus haut certains traitements sont dynamiques et asynchrones alors l'outil Fiddler devrait pouvoir t'aider.

    Maintenant je ne dis pas que ça sera plus simple mais un minimum de notions sur la constitution des requêtes Web est fortement recommandé !

    Personnellement j'utilise que des webrequests lorsque je veux :

    - me connecter/déconnecter à un site
    - récupérer des données sur une page Web
    - héberger des contenus....
    ...and so on.....

    ....et bien souvent les APIs de traitement requiert ce type d'utilisation.

    Il est également possible d'utiliser la classe Webclient qui lorsqu'on en hérite devient très complète.



    A+

Discussions similaires

  1. Conversion de site web ASP.NET en projet d'application Web
    Par brazilia28 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/03/2009, 12h00
  2. Réponses: 2
    Dernier message: 22/02/2008, 22h17
  3. Développement site web ASP.NET
    Par adiekmann dans le forum Devis
    Réponses: 1
    Dernier message: 29/01/2008, 10h40
  4. site web asp.net
    Par christi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 29/01/2007, 14h13

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