Браузер GeckoFX 60, который я использую в WPF, имеет метод сценария оценки, который принимает код javascript (в виде строки).
Что я сделал:
- Поискал видео на YouTube, чтобы проверить мой javascript код
- Размещение
document.getElementById('date').innerText
на консоли дало мне необходимую информацию - Вернулся к моему Приложение WPF и поместил это:
(C#)
string videoDate = "";
using (Gecko.AutoJSContext js = new Gecko.AutoJSContext(YouTubeBrowser.Window))
{
js.EvaluateScript("document.getElementById('date').innerText", out videoDate);
}
NewProject.VideoDate = DateTime.Parse(videoDate);
Проблема:
Это ловило ошибку, поэтому я поместил разрыв перед синтаксическим анализом строки и обнаружил, что строка videoDate имеет значение null
Что я ожидал:
Я ожидал, что он вернет •Jan 30, 2008
, показанный консолью когда я ввел код js в браузере.
Пока эти строки кода работают для меня (как на консоли, так и в GeckoBrowser моего wpf-приложения) при получении другой информации из видео YouTube:
js.EvaluateScript("document.title", out videoTitle);
= получает заголовок видео
js.EvaluateScript("document.URL", out videoId);
= получает URL-адрес видео (который я затем отфильтрую, чтобы получить только идентификатор видео в c#)
Еще несколько вещей, которые я пробовал, не работали:
A. Использование GeckoElement и получение документа браузера и его textContent
GeckoElement elem = YouTubeBrowser.Document.GetElementById("date");
videoDate = elem.textContent;
B. Использование GeckoElement и получение DomDocument браузера и его textContent
GeckoElement elem = YouTubeBrowser.DOMDocument.GetElementById("date");
videoDate = elem.textContent;
C. Изменил innerText на textContent (основываясь на другом SO-ответе, который, как я видел, сказал, что firefox не понимает innerText (что странно, так как он работал на консоли, но я думаю, что они добавили поддержку для этого позже), а использует textContent для получения значение)
string videoDate = "";
using (Gecko.AutoJSContext js = new Gecko.AutoJSContext(YouTubeBrowser.Window))
{
js.EvaluateScript("document.getElementById('date').textContent", out videoDate);
}
NewProject.VideoDate = DateTime.Parse(videoDate);