如何使用Selenium C#获取ko.toJS生成的输入框值?
解决Selenium获取Knockout.js绑定输入框值的问题
问题原因
你遇到的问题源于Knockout.js的双向绑定机制:它不会修改HTML标签上的静态value属性(也就是你看到的value=""),而是直接更新DOM元素的动态value属性。GetAttribute("value")只能读取HTML标签上的初始静态值,因此会返回空结果。
解决方案
方法1:直接读取Knockout ViewModel的数据
页面已将ViewModel挂载到window.DocMVVM,可以通过执行JavaScript直接获取ViewModel中的值:
string receiverLastName = (string)driver.ExecuteScript("return window.DocMVVM.Reciever().LastName;");
- 注意:
Reciever()是KO的observable对象,必须加()才能获取其内部的实际数据对象,再访问LastName属性。
方法2:用GetProperty替代GetAttribute
如果需要从DOM元素获取当前显示值,使用GetProperty("value")获取DOM的动态属性,而非HTML的静态属性:
driver.FindElement(By.Id("Reciever_LastName")).GetProperty("value");
- 定位元素时直接用
By.Id("Reciever_LastName")即可,比复杂的CSS选择器更高效准确。
额外提示
如果页面加载或ViewModel初始化存在延迟,先等待元素可见再执行操作,避免元素未找到的错误:
// 等待元素可见 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); IWebElement lastNameInput = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("Reciever_LastName"))); // 获取值 string value = lastNameInput.GetProperty("value");
内容的提问来源于stack exchange,提问作者Dilmurod Azimov
相关产品推荐
相关产品推荐

