2017-10-15 16 views
0

Je travaille sur une application Windows avec GeckoWebBrowser et j'essaie de cocher la case d'un Captcha via le code. Programmaticaly je peux déjà obtenir et mettre des éléments html, mais cette case à cocher je ne peux pas atteindre. Je ne peux pas le trouver dans n'importe quel endroit de la page. Je n'essaie pas de décartrer ou de résoudre le captcha, il suffit de cocher l'élément case à cocher et ensuite de vérifier si elle est cochée. Aussi simple que ça.GeckoWebBrowser comment marquer la case Captcha (formulaires Windows C#)?

Ce que je sais en ce moment:

Dans l'inspecteur FireFox je peux voir enter image description here Quelques informations évidentes: le captcha est dans une iframe title = "widget de recaptcha", width = 304 et la hauteur = 78 .

L'élément de case à cocher est en ce point (à l'intérieur du iframe): enter image description here

Maintenant, voilà comment je suis en train d'obtenir la case à cocher, à la recherche d'identité, la durée, div et la classe de différentes manières avec sans succès ...

en premier lieu, dans le document principal

  //looking all elements into main Document (around 1300 elements) 
      GeckoElementCollection collection = geckoWebBrowser1.Document.GetElementsByTagName("*"); 
     foreach (GeckoHtmlElement elem in collection) 
     { 
      string id = elem.Id; 
      if (id == "recaptcha-anchor") 
      { 
       string myId = "this is my ID";   //never find this ID! 
      } 
      //just for debug 
      string LocalName = elem.LocalName; 
      string OuterHtml = elem.OuterHtml; 
      string TagName = elem.TagName; 
      string TextContent = elem.TextContent; 
      string role = elem.GetAttribute("role"); 
      string value = elem.GetAttribute("value"); 
     } 

Ainsi, dans le document principal, je ne trouve rien par ID.

Ensuite, la recherche en iframe:

 //get the iframe works well 
     foreach (GeckoIFrameElement iframe in geckoWebBrowser1.Document.GetElementsByTagName("iframe")) 
     { 
      //get main info about the iframe - ok 
      string title = iframe.GetAttribute("title"); 
      if (title != null && title.ToLower().Contains("captcha")) //got "recaptcha widget" 
      { 
       int x = iframe.OffsetLeft; 
       int y = iframe.OffsetTop; 
       int width = Convert.ToInt32(iframe.Width); 
       int height = Convert.ToInt32(iframe.Height); 
      } 

      //inside the iframe, get all elements --> but always return null 
      Gecko.Collections.IDomHtmlCollection<GeckoElement> collection2 = iframe.GetElementsByTagName("*"); 
      foreach (GeckoHtmlElement elem in collection2) 
      { 
       string id = elem.Id; 
       string LocalName = elem.LocalName; 
       string OuterHtml = elem.OuterHtml; 
       string TagName = elem.TagName; 
       string TextContent = elem.TextContent; 
       string role = elem.GetAttribute("role"); 
       string value = elem.GetAttribute("value"); 
      } 

      //foreach (GeckoHtmlElement elem in iframe.GetElementsByTagName("*"))    //get no elements 
      //foreach (GeckoHtmlElement elem in iframe.GetElementsByTagName("input"))   //get no elements 
      //foreach (GeckoHtmlElement elem in iframe.GetElementsByTagName("div"))   //get no elements 
      foreach (GeckoHtmlElement elem in iframe.GetElementsByTagName("span"))   //get no elements 
      { 
       string id = elem.Id; 
       string LocalName = elem.LocalName; 
       string OuterHtml = elem.OuterHtml; 
       string TagName = elem.TagName; 
       string TextContent = elem.TextContent; 
       string role = elem.GetAttribute("role"); 
      } 
     } 

Ainsi, après beaucoup d'essais et erreurs, je ne peux pas l'élément de case à cocher, mais je peux obtenir quelques informations sur la boîte de captcha, comme la position et la taille , bien que le titre ne soit pas 100% comme je m'y attendais: dans Firefox le titre = "widget recaptcha" et dans le titre GeckoWebbrowser = "widget recaptcha" ... un peu bizarre.

Ce me rend fou ... :-(

Tout le monde a une certaine Sugestion ce que je manque ou ce que je fais mal? Il y a un moyen d'obtenir tous les éléments html même dans les iframes ou l'arbre d'élément complet?

est possible de faire ce que je suis en train de faire?

Merci à l'avance!

Répondre

1

pour trouver tous les éléments iframe à la page en cours utiliser la propriété Frames de GeckoWin dow:

// this will return a collecton of all frames 
var iframes = Browser.Window.Frames; 

Je vous conseillerais à le faire dans le gestionnaire de DocumentCompleted cas de votre navigateur. Puis itérer à travers ces cadres. Chaque cadre a son propre élément Document, qui est en fait un conteneur pour tous les éléments à l'intérieur. Votre captcha devrait être là. Ensuite, vous voulez sans doute trouver div avec case à cocher, puis cliquez dessus, de sorte que le code looké comme ceci:

foreach (var iframe in iframes) 
{ 
    var doc = iframe.Document; 
    if (doc == null) 
     continue; 

    var elements = doc.GetElementsByClassName("your_name"); 

    foreach (var element in elements) 
    { 
     // get the div and validate it 
     var myDiv = element as GeckoDivElement; 
     if(myDiv == null || !myDiv.Id.Equals("your_checkbox_id", StringComparison.InvariantCultureIgnoreCase)) 
      continue; 

     myDiv.Click(); // click your checkbox 
     break; 
    } 
} 
+0

lieu GeckoDivElement J'utilise GeckoHtmlElement. Merci! –