2017-10-15 90 views
0

我正在使用GeckoWebBrowser處理Windows應用程序,並試圖通過代碼檢查Captcha的複選框。 Programmaticaly我已經可以獲取和設置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中標題=「widget recaptcha」,在GeckoWebbrowser標題=「recaptcha widget」中......一個詭異的怪誕。

這是推動我瘋了...... :-(

任何人有一些sugestion什麼,我丟失或我在做什麼錯? 有一種方式來獲得,甚至iframe中所有的HTML元素或完整元素樹?

可以做什麼,我想幹什麼?事先

謝謝!

回答

1

要找到在當前頁面中的所有iframe元素使用GeckoWin的Frames財產道瓊斯:

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

我建議你在DocumentCompleted事件瀏覽器的處理程序做到這一點。 然後遍歷這些幀。每個框架都有自己的Document元素,它實際上是其中所有元素的容器。你的驗證碼應該在那裏。那麼你可能想找到DIV使用複選框,並單擊它,這樣的代碼將looke這樣的:

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

我使用GeckoHtmlElement相反GeckoDivElement。謝謝! –

相關問題