【问题标题】:How to select a class by GetElementByClass and click on it programmatically如何通过 GetElementByClass 选择一个类并以编程方式单击它
【发布时间】:2011-03-27 01:16:39
【问题描述】:

我一直在尝试使用此代码在 html/ajax 中按类读取元素,因为我知道 GetElementByClass 不是 webBrowser.Document 中的选项。我似乎无法获得返回值然后调用该成员。有解决办法吗?

参考资料: Getting HTMLElements by Class Name

例子:

<span class="example">(<a href="http://www.test.com/folder/remote/api?=test" onclick=" return do_ajax('popup_fodder', 'remote/api?=test', 1, 1, 0, 0); return false; " class="example">test</a>)</span>

示例代码:

   HtmlElementCollection theElementCollection = default(HtmlElementCollection);
   theElementCollection = webBrowser1.Document.GetElementsByTagName("span");
   foreach (HtmlElement curElement in theElementCollection)
   {
        //If curElement.GetAttribute("class").ToString = "example"  It doesn't work.  
        // This should be the work around.
        if (curElement.OuterHtml.Contains("example"))
        {
            MessageBox.Show(curElement.GetAttribute("InnerText")); // Doesn't even fire.
            // InvokeMember(test) after class is found.
        }
    }

【问题讨论】:

    标签: c# html ajax browser webbrowser-control


    【解决方案1】:

    我承认这不是很直观,但您需要使用GetAttribute("className") 而不是GetAttribute("class")

    HtmlElementCollection theElementCollection = default(HtmlElementCollection);
    theElementCollection = webBrowser1.Document.GetElementsByTagName("span");
    foreach (HtmlElement curElement in theElementCollection)
    {
        if (curElement.GetAttribute("className").ToString() == "example")
        {
            MessageBox.Show(curElement.GetAttribute("InnerText")); // Do something you want
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是我如何使用 webbrowser 控件查找特定于类的元素并调用 Click on a link 的示例。

      简化的>

         foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("li"))
              {
                  // use contains() if the class attribute is 
                  // class="page_item page-item-218 current_page_item"
                  //this to be more on spot! >> if (item.OuterHtml.Contains("class=\"page_item"))
                  // or
                  if (item.OuterHtml.Contains("page_item"))
                  {
                      foreach (HtmlElement childItem in item.Children)
                      {
                          if (childItem.TagName == "A")
                          {
                              //Click the link/Current element
                              childItem.InvokeMember("Click");
                              break;
                          }
                      }
                      break;
                  }
              } 
      

      这样行吗?..

      这里对我有用。

      或者我误解了你的问题?

      【讨论】:

      • 这不会触发示例链接中的事件。如果您再次查看链接,我正在尝试触发 ajax 事件“测试”。 =)
      【解决方案3】:

      为什么不为此使用 qjuery 的选择器引擎。 另外,您希望 messagebox.show 出现在哪里?

      【讨论】:

      • 太棒了,jquery 的一个分支? ;)
      • Messagebox.Show 是为了向我展示它检索到的文本。 JQuery 我不熟悉。有这种情况的例子吗?
      【解决方案4】:
      Dim HtmlElementcolltwo As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("button")
              For Each eleme As HtmlElement In HtmlElementcolltwo
                  ' Check the attributtes you want
                  If eleme.GetAttribute("className") = "derrt_submit feed-zed-bff" Then
                      'Check even the text if you want
                      ' If elem.InnerText = "Sign In" Then
                      'Invoke your event
                      eleme.InvokeMember("click")
                      'End If
                  End If
              Next
      

      这也可以代替使用“class”使用“className”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-17
        • 2011-12-09
        • 2021-08-02
        • 1970-01-01
        • 2012-06-25
        • 2020-09-29
        • 2021-09-22
        • 1970-01-01
        相关资源
        最近更新 更多