VB.Net无法设置Web表单重复ID文本字段值的问题求助
解决VB.Net填充Web表单时重复ID元素定位问题
这问题太常见了!HTML规范里明确要求id属性必须是唯一的,但碰到这种不规范的页面确实头疼——getElementById()默认只会返回第一个匹配该ID的元素,也就是那个<div>,所以你的代码才会把值设置到div上,而不是目标input框。
下面给你几种可行的解决方法,按推荐程度排序:
方法1:使用CSS选择器精准定位(推荐,IE9+支持)
利用querySelector()方法直接通过CSS选择器选中目标input,它能精准定位到id="ClientAccession"的div下的input元素:
Sub AddDataToTomForm(AccessionNumber As String) Dim IE As Object 'Internet explorer object Dim inputElement As Object 'Create IE Object IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate("http://SampleWebSite.com") 'Your website Do While IE.Busy Application.DoEvents() '等待页面加载完成 Loop ' 正常填充ClientAccountNumber IE.document.GetElementById("ClientAccountNumber").SetAttribute("value", AccessionNumber) ' 定位ClientAccession的input元素 inputElement = IE.document.querySelector("#ClientAccession input") If inputElement IsNot Nothing Then inputElement.SetAttribute("value", AccessionNumber) End If ' Clean up IE = Nothing End Sub
方法2:先定位div再找子input(兼容旧版IE)
如果你的程序需要兼容IE8及以下版本,可以先找到重复ID的div,再在它的子元素里找input:
Sub AddDataToTomForm(AccessionNumber As String) Dim IE As Object 'Internet explorer object Dim clientAccessionDiv As Object Dim inputElement As Object 'Create IE Object IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate("http://SampleWebSite.com") 'Your website Do While IE.Busy Application.DoEvents() '等待页面加载完成 Loop ' 正常填充ClientAccountNumber IE.document.GetElementById("ClientAccountNumber").SetAttribute("value", AccessionNumber) ' 先找到div,再找它下面的第一个input clientAccessionDiv = IE.document.GetElementById("ClientAccession") If clientAccessionDiv IsNot Nothing Then inputElement = clientAccessionDiv.GetElementsByTagName("input")(0) inputElement.SetAttribute("value", AccessionNumber) End If ' Clean up IE = Nothing End Sub
方法3:通过class筛选(兜底方案)
如果上面两种方法都不行,还可以通过input的class="text"来筛选,遍历所有text类的input,找到ID匹配的那个:
Sub AddDataToTomForm(AccessionNumber As String) Dim IE As Object 'Internet explorer object Dim inputElements As Object 'Create IE Object IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate("http://SampleWebSite.com") 'Your website Do While IE.Busy Application.DoEvents() '等待页面加载完成 Loop ' 正常填充ClientAccountNumber IE.document.GetElementById("ClientAccountNumber").SetAttribute("value", AccessionNumber) ' 遍历所有text类的input,找到目标元素 inputElements = IE.document.GetElementsByClassName("text") For Each elem As Object In inputElements If elem.Id = "ClientAccession" Then elem.SetAttribute("value", AccessionNumber) Exit For '找到后退出循环 End If Next ' Clean up IE = Nothing End Sub
额外提醒
虽然这些方法能临时解决问题,但从长期来看,最好让前端开发人员修复重复ID的问题——重复ID违反HTML标准,不仅会导致元素定位错误,还可能引发其他脚本兼容性问题。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

