2012-12-27 66 views
1

我只需要点击由唯一类标识的元素的第一个子元素。GeckoFX:将GeckoNode投射到GeckoHTMLElement

到目前为止我的代码是:

geckoWebBrowser.Document.GetElementsByClassName("button")[0].FirstChild.Click(); 

问题是GeckoFX 16的geckoWebBrowser.Document.GetElementsByClassName返回类型GeckoNode,这可是没有Click方法的Array,所以这段代码难道不工作。另一方面,方法
geckoWebBrowser.Document.GetElementsByName
返回类型GeckoHTMLElement的数组,其确实有Click方法。

基于这个事实,我尝试使用as运算符进行投射,但是这总是会抛出一个Exception,并显示它不能被投射。
我在GeckoFX的课程中已经搜索了很多东西(可惜没有任何文档),但我没有找到任何东西

任何帮助将不胜感激。

回答

3

在投射之前,您需要确保节点实际上是一个元素,而不是例如文本节点。

GeckoNode node = geckoWebBrowser.Document.GetElementsByClassName("button")[0].FirstChild; 
if (NodeType.Element == node.NodeType) 
{ 
    GeckoElement element = (GeckoElement)node; 
    element.Click(); 
} 
else 
{ 
// Even though GetElementByClassName return type could contain non elements, I don't think 
// it ever would in reality. 
Console.WriteLine("First node is a {0} not an element.", node.NodeType); 
} 
+0

您可能需要考虑添加一些文字来描述您的解决方案。例如*只检查节点类型,看看节点类型是否是* –

+0

你的代码总是说它不是一个geckoelement,但我已经通过执行javascript,通过querySelectorAll选择元素,给它一个唯一的类名,然后单击geckofx – Tearsdontfalls

+0

那么为什么类型是这样说的? – Tom

0

GeckoElement不支持Click,但是GeckoHtmlElement。

geckoWebBrowser.Document.GetElementsBy ...不返回GeckoHtmlElement,只有GeckoElement(s);好难过!

+0

GetHtmlElementById的存在以及GetElementById – Tom

1

你知道如果html已经被加载?

尝试在发生DocumentCompleted事件后运行此代码。

geckoWebBrowser1.DocumentCompleted += geckoWebBrowser1_DocumentCompleted; 

private void geckoWebBrowser1_DocumentCompleted(object sender, EventArgs e) 
{ 
    // Here you can add the coding to perform after document loaded 
    GeckoInputElement txtbox = (GeckoInputElement)geckoWebBrowser1.Document.GetElementById("txtBox1"); 
    txtbox.SetAttribute("value","OK"); 
}