如何使用Webkit浏览器点击链接?

5

我想在访问网站后单击链接

 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控件时,上面的代码等效于什么?

我不是很理解你的问题,但是你是指按住Ctrl键并单击链接吗? - Max
我在这里发现了一些有趣的信息:http://webkitdotnet.sourceforge.net/docs/ - Max
在页面加载完成后,您能否简单地导航到链接href? - jamesthollowell
点击可能与导航不同,这取决于页面。如果存在JavaScript事件处理程序,则使用导航时可能不会执行它们。如果href是纯JavaScript,则导航调用可能根本无法工作。 - user871199
1
你尝试过这样的代码吗:webKitBrowser1.StringByEvaluatingJavaScriptFromString(document.getElementById('lnkId').click()) - Paul Zahra
3个回答

5

由于WebKit不提供Click()事件(详见此处),因此您无法按照上述方式进行操作。但是,以下小技巧可能作为原始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。然后提供hrefNamedNodeMap,即Attributes作为NodeName,您可以轻松提取NodeValue,这在本例中是目标网址。然后,您只需在WebKitBrowser实例上调用Navigate(urlString)方法即可复制click事件。

我是那个有赏金的人,但我不想问另一个几乎重复的问题。我正在设置文本框中的文本,并且必须按照您发布的方式进行操作,但现在没有“SetAttribute”的选项。如何设置属性? - Dozer789
请问您能否查看一下 WebKit.DOM.Element 类提供的方法?您可以像这样使用所需的方法:((WebKit.DOM.Element) el).SetAttribute("NAME", "VALUE"); - Wasif Hossain
我自己想出了那部分,但是我忘记告诉你了。 - Dozer789
请注意,导航调用在很多情况下可能无法正常工作,这取决于页面的开发方式。如果您可以控制页面,则没有问题,因为您可以调整 href。如果您无法控制页面,则上述方法将不能生成 "onclick" 事件,而许多网站使用它来更改功能。此外,某些 href 可能是 JavaScript 代码。换句话说,导航并不总是等同于单击链接。 - user871199

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,则Document.GetElementById将为你节省循环。


-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();");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接