【问题标题】:webbrowser doesn't invoke click on span网络浏览器不调用跨度点击
【发布时间】:2015-07-15 12:38:03
【问题描述】:

我正在尝试使用 webbrowser 控件使用 c# 废弃一些页面。

为了将所有信息废弃,我必须单击一个具有 onclick 事件的 span 元素。

这是 span 的样子:

<span title="title" class="class" onclick="somefunction(value);"></span>

这是我的代码:

foreach (HtmlElement span in table.GetElementsByTagName("span"))
        {
            span.InvokeMember("click");
        }

它真的很简单,出于某种原因它什么也没做。我试图评估代码,我得到的结果是空的。

知道如何调用该点击吗?

【问题讨论】:

  • onclick 事件应该返回什么?
  • onclick 事件应该向服务器运行 AJAX 请求并将其附加到 DOM 中正确的 html 标记
  • 那么,评估代码会评估为 null 吗?
  • 正如我在帖子中所说的那样。如果我这样做:var x = span.InvokeMember("click"); 我得到 null
  • 是的,对不起,我看错了问题

标签: javascript c# html webbrowser-control


【解决方案1】:

这是一个使用 .NET 4.5 和 WPF 的示例,但可以轻松调整任何内容以适应 WinForm WebBrowser 控件。 我假设您的 HTML 页面看起来像这样:

  <html>
    <head>
      <script>
        function somefunction(value){
          alert("clicked on: " + value);
        }
      </script>
    </head>
    <body>
      <span title="title" class="class" onclick="somefunction('span_01');">Blah blah blah</span>
      <span title="title" class="class" onclick="somefunction('span_02');">Blah blah blah</span>
      <span title="title" class="class" onclick="somefunction('span_03');">Blah blah blah</span>
    </body>
  </html>

并且您有一个包装 WebBrowser 控件的 UserControl(下面的 XAML)

  <UserControl x:Class="WebBrowserExample.WebBrowserAdapter"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
               xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
               mc:Ignorable="d" 
               d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
          <WebBrowser x:Name="WebBrowserControl"></WebBrowser>
      </Grid>
  </UserControl>

然后一个可能的解决方案是在页面中注入一个 Javascript 函数来执行您想要的操作并从 .NET 调用它。 在 WebBrowserAdapter 类中添加以下方法:

  void WebBrowserAdapter_Loaded(object sender, RoutedEventArgs e)
  {
      WebBrowserControl.LoadCompleted += WebBrowserControl_LoadCompleted;
      WebBrowserControl.Navigate("http://localhost:9080/console/span.html");
  }

  void WebBrowserControl_LoadCompleted(object sender, NavigationEventArgs e)
  {
      IncjectClickOnSpanElementScript();
  }

  private void IncjectClickOnSpanElementScript()
  {
      String script =
  @"      function triggerClicksOnSpan(){
  var spans = document.getElementsByTagName('span');
  for(var i = 0; i < spans.length; i++){
    spans[i].click();
  }
  }";

      InjectScript(script);
      WebBrowserControl.InvokeScript("triggerClicksOnSpan");
  }

public void InjectScript(String scriptText)
{
    HTMLDocument htmlDocument = (HTMLDocument)WebBrowserControl.Document;

    var headElements = htmlDocument.getElementsByTagName("head");
    if (headElements.length == 0)
    {
        throw new IndexOutOfRangeException("No element with tag 'head' has been found in the document");
    }
    var headElement = headElements.item(0);

    IHTMLScriptElement script = (IHTMLScriptElement)htmlDocument.createElement("script");
    script.text = scriptText;
    headElement.AppendChild(script);
}

您需要在项目的引用中添加 Microsoft.mshtml。 请注意,在这个简化的示例中,每次加载页面时都会注入脚本。我想您将需要调整代码以适应您的需求

【讨论】:

  • 这看起来是一个很棒的解决方案,但我不知道你是如何注入脚本的。有没有我不知道的名为 InjectScript 的方法?
  • 抱歉,我错过了那个...我会在一分钟内编辑答案。 [完成]
  • 经过数小时的黑客攻击后,我仍然一无所获。我确实成功地将脚本注入到 html 的 head 标记中,但 webBrowser.Document.InvokeScript("triggerSpans"); 完全没有做任何事情 :( 我尝试了 2 种类型的脚本 1 使用 jquery,另一种是本机 javascript,我确实在浏览器控制台中尝试过它们,它们确实有效。您还有其他想法吗?
  • 一个想法:在 InternetExplorer 设置为 IE 7 模式后测试脚本。查看控制台以查找每个可能的错误。 WebBrowser 控件的默认引擎是IE7,一些javascript函数不兼容。如果是这种情况,您可以通过在注册表中添加一个键来更改引擎(然后我可以告诉您哪个键)
  • Jquery 在 IE7 中可以正常工作,但原生的不行,它有错误。问题是 webbrowser 是否有运行 jquery 的任何问题.. 以防万一我很想得到你所说的那个注册表:) 非常感谢~!
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2012-06-22
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多