如何使用 GeckoFX 60 的评估脚本方法获取 YouTube 视频的上传日期?
How do I get a youtube video's upload date using GeckoFX 60's evaluate script method?
我在 WPF 中使用的 GeckoFX 60 浏览器有一个评估脚本方法,它接受 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
我的预期:
当我在浏览器上输入 js 代码时,我希望它 return •Jan 30, 2008
控制台显示。
到目前为止,在从 YouTube 视频获取其他信息时,这些代码行对我有用(在控制台和我的 wpf 应用程序的 GeckoBrowser 上):
js.EvaluateScript("document.title", out videoTitle);
= 获取视频标题
js.EvaluateScript("document.URL", out videoId);
= 获取视频 Url(然后我将其过滤掉以仅获取 c# 中的视频 ID)
还有一些我试过但没有用的东西:
一个。使用 GeckoElement 并检索浏览器的 Document 及其 textContent
GeckoElement elem = YouTubeBrowser.Document.GetElementById("date");
videoDate = elem.textContent;
乙。使用 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);
我认为这与 YouTube 上的动态 DOM 有关。
虽然我无法通过元素 ID 检索值,但我通过 class 名称在另一个标签上找到了相同的信息:
_gfxBrowser.Document.GetElementsByClassName("watch-time-text")[0].TextContent
Returns: "Published on Jan 25, 2019"
我在 WPF 中使用的 GeckoFX 60 浏览器有一个评估脚本方法,它接受 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
我的预期:
当我在浏览器上输入 js 代码时,我希望它 return •Jan 30, 2008
控制台显示。
到目前为止,在从 YouTube 视频获取其他信息时,这些代码行对我有用(在控制台和我的 wpf 应用程序的 GeckoBrowser 上):
js.EvaluateScript("document.title", out videoTitle);
= 获取视频标题
js.EvaluateScript("document.URL", out videoId);
= 获取视频 Url(然后我将其过滤掉以仅获取 c# 中的视频 ID)
还有一些我试过但没有用的东西:
一个。使用 GeckoElement 并检索浏览器的 Document 及其 textContent
GeckoElement elem = YouTubeBrowser.Document.GetElementById("date");
videoDate = elem.textContent;
乙。使用 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);
我认为这与 YouTube 上的动态 DOM 有关。
虽然我无法通过元素 ID 检索值,但我通过 class 名称在另一个标签上找到了相同的信息:
_gfxBrowser.Document.GetElementsByClassName("watch-time-text")[0].TextContent
Returns: "Published on Jan 25, 2019"