使用 C# 从 GetElementById 获取空值

Null Value from GetElementById using C#

我已经解决了很多已经提出的问题,但我无法找到解决问题的方法。

我的应用程序是一个视频查找器,用户在文本框中输入 he/she 正在查找的内容,然后从三个网站(Youtube、Metacafe、Screen.yahoo)中选择一个来查找视频.

我已经为每个选择提供了一个方法,但是当它到达 GetElementByID 方法时,它 returns 所有三个都为空值。我假设我错过了一些东西,这就是为什么我对所有 3 种方法都有这个空结果。

首先是Youtube方法

private void YouTube(String Input)
        {
            try
            {
                webBrowser1.Navigate("https://www.youtube.com/");
                HtmlDocument Doc = webBrowser1.Document;
                HtmlElement Search = Doc.GetElementById("search_query");
                Search.SetAttribute("value",Input);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message.ToString(), "Error");
            }

        }

这是我正在尝试访问的搜索栏元素(来自 youtube)。

<input id="masthead-search-term" autocomplete="off" autofocus="" onkeydown="if (!this.value &amp;&amp; (event.keyCode == 40 || event.keyCode == 32 || event.keyCode == 34)) {this.onkeydown = null; this.blur();}" class="search-term masthead-search-renderer-input yt-uix-form-input-bidi" name="search_query" value="" type="text" tabindex="1" placeholder="" title="Search" dir="ltr" spellcheck="false" style="outline: none;">

我已经尝试了这个元素的 id 和 name,但都给了我相同的结果。

不确定你是否需要其他两种方法,因为它们几乎相同,但我将 post 它们以防万一。

这是 metacafe 元素

private void Metacafe(String Input)
        {
            try
            {
                webBrowser1.Navigate("http://www.metacafe.com/");
                HtmlDocument Doc = webBrowser1.Document;
                HtmlElement Search = Doc.GetElementById("searchText");
                //webBrowser1.Document.GetElementById("searchText").SetAttribute("value", Input);
                Search.SetAttribute("value", Input);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString(), "Error");
            }

        }

我正在尝试连接的元素。

<input value="Search Metacafe" type="text" accesskey="s" class="TextField " title="Search Metacafe" autocomplete="off" size="50" name="searchText" tabindex="1" id="SearchQuery">

最后是雅虎方法。

private void Yahoo(String Input)
        {
            try
            {
                webBrowser1.Navigate("https://screen.yahoo.com/");
                HtmlDocument Doc = webBrowser1.Document;
                HtmlElement Search = Doc.GetElementById("p");
                Search.SetAttribute("value", Input);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString(), "Error");
            }

        }

及其元素。

<input id="UHSearchBox" type="text" class="yucs_W(100%) Fz(18px)! O(n):f Fw(200)! Bxz(bb) M(0)! Py(4px)! Bdrs(0)! Bxsh(n)" style="border-color: rgb(117, 144, 245); opacity: 1;" name="p" aria-describedby="UHSearchBox" data-ylk="slk:srchinpt-hddn;itc:1;" data-yltvsearch="https://video.search.yahoo.com/search/" data-yltvsearchsugg="/" data-satype="mini" data-gosurl="https://search.yahoo.com/sugg/ss/gossip-us_ss/" data-pubid="112" data-appid="" data-maxresults="10" data-resize=" " data-rapid_p="2">

感谢您花时间阅读。 /D

您试图通过 Id 来查找元素,但是在方法 GetElementById() 中,您给出了 name 的元素,您需要通过它的 Id 来查找元素这个

HtmlElement Search = Doc.GetElementById("masthead-search-term");

对剩下的两个做同样的事情。

Also this element will be null if page hasn't loaded properly you can only access this element after page has loaded completely.

编辑

您需要添加 WebBrowserDocumentCompleted 事件。此事件在 WebBrowser 完成加载文档时发生。

 private void YouTube(String Input)
    {
        try
        {
            webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
            webBrowser1.Navigate("https://www.youtube.com/");

        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Error");
        }

    }
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlDocument Doc = webBrowser1.Document;
        HtmlElement Search = Doc.GetElementById("search_query");
        Search.SetAttribute("value",Input);
    }

我在 YouTube 上遇到了类似的问题。 None 个 ID 是由 GetElementById 找到的。看起来问题是由其他浏览器引起的。 Opera 和 Edge 网站工具显示其他 class 名称,然后 "Document.Body.InnerHtml" 包含。所以只需将 "Document.Body.InnerHtml" 复制到记事本中,然后找到我正在搜索的 class 名称。

例如获取播放列表中所有歌曲的文件名。打开该播放列表并调用:

Document.GetElementsByTagName("li") 
go through all items and get video name with:
HtmlElement.GetAttribute("data-video-title")