【问题标题】:input tag InvokeMember("Click") not firing onclick event in web browser输入标签 InvokeMember("Click") 未在 Web 浏览器中触发 onclick 事件
【发布时间】:2011-10-09 16:37:20
【问题描述】:

我正在使用 Dotnet Web 浏览器单击输入元素 - 按钮。当这个点击事件被触发时,它会执行一个 JS 函数,该函数使用 Google Recaptcher 生成验证码,其来源类似于 Recaptcha link。 现在的问题是我无法触发 onClick 事件,我正在使用以下代码:

HtmlElementCollection inputColl = HTMLDoc.GetElementsByTagName("input");
        foreach (HtmlElement inputTag in inputColl)
        {
            string valueAttribute = inputTag.GetAttribute("value");
            if (valueAttribute.ToLower() == "sign up")
            {
                inputTag.Focus();
                inputTag.InvokeMember("Click");
                break;
            }
        }

我已经检查了所有内容,我抓住了正确的按钮,但不知道为什么 onClick 事件没有被触发。 欢迎提出任何建议。

【问题讨论】:

  • 您的代码对我有用。这段代码是否有可能在文档在浏览器控件中完全准备好之前运行。
  • 不,文档已完全加载,我能够得到我想要的元素,我已经调试和检查过,我能够抓住它。但是当我点击按钮时没有任何反应,我猜它的点击事件没有被触发,而当我在 Web 浏览器上手动执行它时,它会被点击。
  • 你把代码放在哪里了?确保在文档完全加载后调用它。需要注意的是,Webbrowser 控件的 OnDocumentCompleted 通常会调用两次,因此还要检查 Webbrowser 的 State 以确保它实际上已完成。
  • 首先点击是小写的,如果你没有禁用脚本错误,你一定会得到一些错误。

标签: c# browser onclick recaptcha


【解决方案1】:
  1. 添加对 Microsoft.mshtml 的引用;
  2. 看下面的固定示例:

        HtmlElementCollection inputColl = HTMLDoc.GetElementsByTagName("input");
        foreach (HtmlElement inputTag in inputColl)
        {
            string valueAttribute = inputTag.GetAttribute("value");
            if (valueAttribute.ToLower() == "sign up")
            {
                inputTag.Focus();
                IHTMLElement nativeElement = el.DomElement as IHTMLElement;
                nativeElement.click();
                break;
            }
        }
    

【讨论】:

    【解决方案2】:

    您确定“点击”是正确的名称吗?我有一些几乎相同的代码,做完全相同的事情,属性名称是“onclick”。再看一下页面的 HTML。

                foreach (HtmlElement element in col)
                {
                    if (element.GetAttribute(attribute).Equals(attName))
                    {
                        // Invoke the "Click" member of the button
                        element.InvokeMember("onclick");
                    }
                }
    

    【讨论】:

      【解决方案3】:

      这应该是肯定的。我在包含 onclick 事件的 Anchors 和 DIv 上对其进行了测试。

      HtmlElementCollection inputColl = HTMLDoc.GetElementsByTagName("input");     
      foreach (HtmlElement inputTag in inputColl)     
      {         
          string valueAttribute = inputTag.GetAttribute("value");         
          if (valueAttribute.ToLower() == "sign up")        
          { 
              obj = inputTag.DomElement;                            
              mi = obj.GetType().GetMethod("click");                             
              mi.Invoke(obj, new object[0]);         
          }     
      } 
      

      我无法打开链接查看代码,因此我没有专门针对您的案例进行尝试。 无论如何,如果这不起作用,可以将 TAG 容器插入到表单中,在这种情况下,您必须触发表单的提交事件,而不是触发对 sorm 提交按钮的点击。

      无论如何,如果您将“click”称为小写字母,那么您的代码可能也能正常工作(我真的没有验证,只是猜测,在 C# 案例中是疯子!)。

      PS:请参阅Webbrowser: sequencing activites when no DocumentCompleted is fired by a link on hosted webpage 获取一些有趣的辅助代码,希望对您有所帮助,希望有人能帮助我!

      【讨论】:

      • “点击”不在方法列表中。它返回 null 到 mi。
      【解决方案4】:

      由于您已经将对象放在焦点上,请尝试像这样发送ENTER 键:

      SendKeys.Send("{ENTER}")
      

      【讨论】:

        【解决方案5】:

        试试

        if (inputTag.InnerHtml == "sign up" || inputTag.InnerText.Contains("sign up"))
        {
             inputTag.InvokeMember("click");
        }
        

        只要按条件玩,检查你是否得到正确的按钮。顺便说一句,InvokeMember 上的小案例“单击”。这是我使用的,它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-08
          • 2013-10-06
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多