我正在VS2017开展一个winforms项目。我从2017年11月17日起使用Geckofx45版本45.0.33 Nuget包。我已经将项目设置为32位。
初始化程序编码为:
[STAThread]
static void Main()
{
...
Xpcom.Initialize("Firefox");
....
}
主窗体构造函数中当前的概念验证代码目前看起来像这样:
public MainForm(IConfigurationRoot configuration)
{
InitializeComponent();
...
WebDisplay = new GeckoWebBrowser()
{
Dock = DockStyle.Fill
};
WebDisplay.Navigate("https://www.google.com/");
while (WebDisplay.IsBusy)
Application.DoEvents();
GeckoHtmlElement payloadElement = WebDisplay
.Document
.GetHtmlElementById("viewport");
...
}
让我们在这里休息并观察问题。浏览器控件按预期呈现在表单中,显示Google主页。如果我右键单击View Source的控件,我会看到我期望从导航目标获得的html。一切都在UX层中检出。
但是,我需要在DOM中查找,我的查询都将返回null。 GetHtmlElementById
不仅没有返回任何东西,进一步探索Document
属性(或DomDocument
属性,或我遇到的任何其他DOM访问器)在根(Header,Body)上显示2个孩子,两者都是空:WebDisplay.Document.Body.HasChildNodes = false
。
踢球者,控制显然是呈现预期的内容;这是一个API,除了一个空的Header和Body元素节点之外没有显示任何东西。
我在这做错了什么?谢谢!
好吧,我能够排除这一个。怀疑,这是一个时间问题。尝试使用IsBusy
(我在SO上找到的建议)不足以确保在查询之前加载DOM。
在我的用例中,我需要能够在第一次显示表单时动态地将内容呈现到DOM中。为此,必须使用DocumentCompleted
事件:
WebDisplay.DocumentCompleted
+= new EventHandler<GeckoDocumentCompletedEventArgs>(WebDisplay_DocumentCompleted);
尝试从表单构造函数查询DOM将无法正常工作。干杯!