2015-05-31 2 views
1

Я уже загрузил заданные вопросы, но я не смог найти решение для своей проблемы.Null Value из GetElementById с использованием C#

Мое приложение - это поисковик видео, пользователь вводит то, что он ищет в текстовом поле, а затем выбирает один из трех веб-сайтов (Youtube, Metacafe, Screen.yahoo), чтобы найти видео.

Ive получил метод для каждого из вариантов, но когда он достигает метода GetElementByID, он возвращает нулевое значение для всех трех. Я собираюсь предположить, что у меня что-то пропустило, и почему я получил этот нулевой результат для всех трех методов.

Во-первых, здесь метод 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;"> 

Я пробовал оба идентификатора и имени этого элемента, но оба дали мне тот же результат.

Не уверен, что вам понадобятся другие два метода, так как они почти идентичны, но я собираюсь опубликовать их только как раз.

Вот 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"> 

И наконец метод Yahoo.

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

+0

Я думаю, что ваша задача будет проще, если вы будете использовать предоставленные API для Youtube и других сайтов. Запросить сайты и заполнить форму поиска можно, но если в любой момент страницы меняются, вам придется переписать свое приложение ...Проверьте API-интерфейс youtube здесь: https://developers.google.com/youtube/v3/, и я уверен, что на других сайтах есть что-то симпатичное. –

ответ

1

Вы пытаетесь найти элемент по его Id, но в методе GetElementById() вы даете name элемента вам необходимо найти элемент по его Id как этот

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); 
    } 
+0

Привет, спасибо за вашу помощь. Это решило мою проблему:] Просто нужно найти, чтобы отправить переменную ввода в новый метод. Но еще раз спасибо за вашу помощь. – Demonic217

+0

Вы можете сделать глобальную переменную и сохранить ее значение, а не использовать эту переменную в новом методе. – Mairaj

Смежные вопросы