使用C#从GetElementById获取空值

时间:2015-05-31 10:09:20

标签: c# youtube null getelementbyid

我已经完成了许多已经问过的问题,但我还没能找到解决问题的方法。

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

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

首先是Youtube方法

  if(arr[i][j+1] < arr.length)

以下是我尝试访问的搜索栏(来自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");
            }

        }

我已尝试过此元素的ID和名称,但两者都给了我相同的结果。

不确定天气是否需要其他两种方法,因为它们几乎相同,但我只是想发布它们。

这是metacafe元素

<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;">

和我尝试连接的元素。

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");
            }

        }

最后是Yahoo方法。

<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");
            }

        }

感谢您花时间阅读它。 / d

2 个答案:

答案 0 :(得分:1)

您正在尝试按Id找到元素,但在方法GetElementById()中您需要name元素,您需要找到元素Id,就像这样< / p>

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

对其余两个人做同样的事情。

  

如果页面未正确加载,此元素也将为null   只有在页面有loaded completely后才能访问此元素。

修改

您需要添加DocumentCompleted WebBrowser事件。 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);
    }

答案 1 :(得分:0)

我在youtube上也遇到了类似的问题。 GetElementById未找到任何ID。看来问题是由其他浏览器引起的。 Opera和Edge网站工具显示其他类名称,然后包含“ Document.Body.InnerHtml”。因此,只需将“ Document.Body.InnerHtml”复制到记事本中,即可找到我正在搜索的类名。

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

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