【问题标题】:How to click on a link using Webkit Browser?如何使用 Webkit 浏览器点击链接?
【发布时间】:2013-04-22 14:25:42
【问题描述】:

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

 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 并点击链接?
  • 我已经编辑了@Mobstaa 的帖子
  • 我在这里发现了一些有趣的信息:webkitdotnet.sourceforge.net/docs
  • 你能在加载页面后直接导航到链接href吗?
  • 你有没有尝试过类似的东西:webKitBrowser1.StringByEvaluatingJavaScriptFromString(document.getElementById('lnkId').click())

标签: c# .net webkit


【解决方案1】:

由于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。然后,您可以简单地在WebKitBrowser 实例上调用Navigate(urlString) 方法来复制click 事件。

【讨论】:

  • 我是有赏金的人,但我不想再问一个几乎是重复的问题。我在文本框中设置文本,我必须按照您发布的方式进行操作,但现在没有SetAttribute 的选项。如何设置属性?
  • 您能检查一下WebKit.DOM.Element 类提供的方法吗?您可以像这样使用所需的方法:((WebKit.DOM.Element) el).SetAttribute("NAME", "VALUE");
  • 我自己想出了那部分,但我忘了告诉你。
  • 请注意,根据页面的开发方式,在许多情况下导航调用将不起作用。如果您可以控制页面,则没有问题,因为您可以调整 href。如果您无法控制页面,则上述方法将不会生成“onclick”事件,并且许多站点使用它来更改功能。此外,一些hrefs 可以是javascript 代码。换句话说,导航并不总是相同的是点击链接
【解决方案2】:

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

我不确定您使用的是哪个 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 将为您节省循环。

【讨论】:

    【解决方案3】:
    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();");
    

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2018-10-04
      • 2011-05-12
      • 2012-06-11
      • 2013-03-15
      • 1970-01-01
      • 2011-11-10
      • 2012-07-11
      • 2013-04-27
      相关资源
      最近更新 更多