使用 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 && (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
.
编辑
您需要添加 WebBrowser
的 DocumentCompleted
事件。此事件在 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")
我已经解决了很多已经提出的问题,但我无法找到解决问题的方法。
我的应用程序是一个视频查找器,用户在文本框中输入 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 && (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 hasloaded completely
.
编辑
您需要添加 WebBrowser
的 DocumentCompleted
事件。此事件在 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")