2017-10-15 5 views
0

私はGeckoWebBrowserを使用してWindowsアプリケーションを開発中です。コードでCaptchaのチェックボックスをチェックしようとしています。私はすでにhtml要素を取得して設定することができますが、このチェックボックスは表示できません。私はページのどの場所でもそれを見つけることができません。 私はキャプチャを解読または解決しようとしていません。単にチェックボックスの要素をチェックし、それがチェックされているかどうかを確認してください。そう簡単。GeckoWebBrowser Captchaチェックボックス(C#Windowsフォーム)をマークする方法は?

私は、現時点では知っている:

FireFoxのインスペクタで、私は enter image description here いくつかの明白な情報を見ることができます:キャプチャは、タイトル=「ウィジェットのreCAPTCHA」とiframe内幅= 304、高さ= 78 。

チェックボックス要素は、(IFRAME内)、この時点である:今 enter image description here

、これは私が持つさまざまな方法でID、スパン、DIVおよびクラスを探して、チェックボックスを取得しようとしている方法ですメイン文書

  //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"); 
     } 

には成功...

まず、だから、メイン文書に私はIDによって何かを見つけることはできません。

次に、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"); 
      } 
     } 

ので、試行錯誤の多くの後、私はチェックボックス要素を取得することはできませんが、私は位置や大きさのような、キャプチャボックスに関するいくつかの情報を得ることができます私が期待していたように、タイトルは100%ではありませんが、Firefoxではtitle = "widget recaptcha"とGeckoWebbrowser title = "recaptcha widget" ...リトル・ビザール。

これは狂気私を運転している... :-(

誰もが私が欠けている何か私が間違ってやっているいくつかの暗示があります? でも、アイフレーム内のすべてのHTML要素を取得する方法があります。 、または完全な要素ツリー?

は私がやろうとしているものを行うことは可能ですか?事前に

ありがとう!

答えて

1

GeckoWinのFramesプロパティを使用して、現在のページのすべてのiframe要素を検索するにはダウ:

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

は、私はあなたがあなたのブラウザのDocumentCompletedイベントのハンドラでこれを行うにはお勧め。 このフレームを反復処理します。各フレームには独自のDocument要素があり、実際にはその内部のすべての要素のコンテナです。あなたのキャプチャはそこにあるはずです。そして、あなたはおそらく、チェックボックスでのdivを見つけたい、とのコードは次のようにlookeますので、それをクリックしてください:私はGeckoHtmlElementを使用してい

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

代わりGeckoDivElement。ありがとう! –

関連する問題