WebBrowser控件GetElementById触发NullReferenceException的原因排查
我来帮你排查几个这类问题里的常见坑,大概率能找到原因:
元素还没完成DOM加载:WebBrowser控件的页面渲染和DOM解析是异步的,哪怕你肉眼看到页面显示了,DOM树可能还没完全构建好。如果Button5点击事件触发时,目标元素还没被浏览器解析出来,
GetElementById自然会返回null,进而触发空引用异常。建议把获取元素的逻辑移到WebBrowser.DocumentCompleted事件里,或者在点击事件里先做两层安全判断:If wb1.Document IsNot Nothing Then Dim elem = wb1.Document.GetElementById("_arialId_118.row.cells.displayName") If elem IsNot Nothing Then Col = elem.Name.ToString() Else MessageBox.Show("找不到目标元素") End If End If目标元素嵌套在iframe中:如果带指定ID的元素是在页面的iframe里面,直接用
wb1.Document是访问不到的。你需要先定位到对应的iframe控件,获取它的Document对象,再在这个子文档里调用GetElementById。ID的拼写细节错误:我注意到你代码里写的ID是
_arialId_118.row.cells.displayName,但你提供的页面示例里的ID是_ariaId_118.row.cells——多了一个字母l?如果实际页面的ID是_ariaId开头,那代码里的拼写错误肯定会导致找不到元素,建议用F12开发者工具再仔细核对下页面源码里的真实ID。元素的Name属性本身为null:就算成功找到元素,
Name.ToString()也可能触发空引用异常——如果这个元素本身没有Name属性,或者Name的值是null,调用ToString()就会报错。可以改成先判断Name是否存在:If elem.Name IsNot Nothing Then Col = elem.Name.ToString() Else Col = "元素没有Name属性" End If
另外,你的catch块里还有个小问题:MessageBox.Show(MessageBox.Show(ex.ToString()))嵌套了两层MessageBox.Show,其实只需要一层MessageBox.Show(ex.ToString())就够了。
内容的提问来源于stack exchange,提问作者Cyrill

