如何使用Webkit Browser单击链接?

时间:2013-04-22 14:25:42

标签: c# .net webkit

导航到网站后我想点击链接

 webKitBrowser1.Navigate("http://www.somesite.com");

如果链接的ID为lnkId,如何点击此网站上的链接?

<a href="http://www.google.com" id="lnkId"> Go to Google </a>

在Visual Studio附带的默认浏览器控件中,我可以使用以下代码执行此操作:

 foreach (HtmlElement el in webBrowser1.Document.GetElementTagName("a")) {
 if (el.GetAttribute("id") == "lnkId") {
 el.InvokeMember("click");
 }
 }

当我使用WebkitDotNet控件时,上面代码的等价物是什么?

3 个答案:

答案 0 :(得分:5)

由于WebKit未提供Click()事件(see here for details),您无法以上述方式执行此操作。但是一个小技巧可能与原始的winforms方式相同,如下所示:

foreach (Node el in webKitBrowser1.Document.GetElementsByTagName("a"))
{
    if (((Element) el).GetAttribute("id") == "lnkId")
    {
        string urlString = ((Element) el).Attributes["href"].NodeValue;
        webKitBrowser1.Navigate(urlString);
    }
}

我正在做的是将WebKit.DOM.Node对象转换为其子类WebKit.DOM.Element以获取其Attributes。然后将href提供给NamedNodeMap,即Attributes作为NodeName,您可以轻松提取NodeValue,即此target url案件。然后,您只需调用Navigate(urlString)实例上的WebKitBrowser方法即可复制click事件。

答案 1 :(得分:1)

我不使用Windows,我的所有经验都在Webkit GTK上。以下评论基于该经验。

我不确定您使用的是哪个webkit .NET版本。看起来有多个实现。假设您正在使用Wasif提到的那个,您可以评估示例https://code.google.com/p/open-webkit-sharp/source/browse/JavaScriptExample/Form1.cs中提到的javascript。

实际上,如果实现支持javascript执行,那么即使不是所有DOM操作,也可以执行大部分操作。 API函数通常与javascript函数相同,并且大部分时间内部调用完全相同的函数,尽管它们起源于此。您的应用程序和JavaScript之间的通信可能没那么具有挑战性,但如果您可以阅读警报消息,那么也可以解决。看起来这个库确实支持警报处理机制。我在https://github.com/nhrdl/notesMD写的一个工具将展示一些实现此通信的例子,尽管它使用GTK版本并且是用python编写的。

顺便说一句,如果您知道元素的id,那么Doc​​ument.GetElementById将为您保存循环。

答案 2 :(得分:-1)

webKitBrowser1.StringByEvaluatingJavaScriptFromString("var inpt = document.createElement(\"input\");    inpt.setAttribute(\"type\", \"submit\");    inpt.setAttribute(\"id\", \"nut\"); inpt.setAttribute(\"type\", \"submit\");    inpt.setAttribute(\"name\", \"tmp\");   inpt.setAttribute(\"value\", \"tmp\");  var element = document.getElementById(\"lnk\"); element.appendChild(inpt);");
                    webKitBrowser1.StringByEvaluatingJavaScriptFromString("document.getElementById('nut').click();");