我已经完成了许多已经问过的问题,但我还没能找到解决问题的方法。
我的应用程序是一个视频查找器,用户在文本框中输入他/她正在寻找的内容,然后从三个网站之一(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 && (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
答案 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")