GeckoWebBrowser 如何标记验证码复选框(C# Windows 形式)?
GeckoWebBrowser how to mark the Captcha checkbox (C# Windows forms)?
我正在使用 GeckoWebBrowser 开发一个 Windows 应用程序,我正在尝试通过代码检查验证码的复选框。以编程方式我已经可以获取和设置 html 元素,但是我无法访问此复选框。我在页面的任何地方都找不到它。
我不是要解密或解决验证码,只是检查复选框元素,然后验证它是否被选中。就这么简单
我目前知道的:
在 FireFox 检查器中我可以看到
一些明显的信息:验证码位于标题="widget recaptcha"、宽度=304 和高度=78.
的 iframe 中
复选框元素在这一点上(在 iframe 内):
现在,这就是我尝试获取复选框的方式,以不同的方式寻找 id、span、div 和 class 但没有成功...
首先,在主文档中
//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"...有点奇怪。
这让我发疯...:-(
有人对我遗漏了什么或我做错了什么有一些建议吗?
有没有办法在 iframe 或完整的元素树中获取所有 html 元素?
有可能做我想做的事吗?
提前致谢!
要查找当前页面的所有 iframe 元素,请使用 GeckoWindow 的 Frames
属性:
// this will return a collecton of all frames
var iframes = Browser.Window.Frames;
我建议您在浏览器的 DocumentCompleted
事件处理程序中执行此操作。
然后遍历这些帧。每个框架都有自己的 Document
元素,它实际上是其中所有元素的容器。你的验证码应该在那里。然后你可能想找到带复选框的div,然后点击它,所以代码看起来像这样:
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;
}
}
我正在使用 GeckoWebBrowser 开发一个 Windows 应用程序,我正在尝试通过代码检查验证码的复选框。以编程方式我已经可以获取和设置 html 元素,但是我无法访问此复选框。我在页面的任何地方都找不到它。 我不是要解密或解决验证码,只是检查复选框元素,然后验证它是否被选中。就这么简单
我目前知道的:
在 FireFox 检查器中我可以看到
复选框元素在这一点上(在 iframe 内):
现在,这就是我尝试获取复选框的方式,以不同的方式寻找 id、span、div 和 class 但没有成功...
首先,在主文档中
//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"...有点奇怪。
这让我发疯...:-(
有人对我遗漏了什么或我做错了什么有一些建议吗? 有没有办法在 iframe 或完整的元素树中获取所有 html 元素?
有可能做我想做的事吗?
提前致谢!
要查找当前页面的所有 iframe 元素,请使用 GeckoWindow 的 Frames
属性:
// this will return a collecton of all frames
var iframes = Browser.Window.Frames;
我建议您在浏览器的 DocumentCompleted
事件处理程序中执行此操作。
然后遍历这些帧。每个框架都有自己的 Document
元素,它实际上是其中所有元素的容器。你的验证码应该在那里。然后你可能想找到带复选框的div,然后点击它,所以代码看起来像这样:
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;
}
}