C#使用Selenium无法向Angular的<app-currency-input>发送sendKeys如何解决
解决方案
问题根因
<input>节点,你之前操作的要么是外层自定义组件节点,要么仅修改了DOM的value属性没有触发Angular的双向绑定事件,所以操作无效也不报错。
操作步骤
- 先定位到组件内部真实的原生
<input>节点:打开浏览器F12元素审查,点击目标货币输入框,展开<app-currency-input>的子节点即可找到内部的原生<input>标签。 - 任选以下一种方案执行:
方案1:直接操作原生输入框
// 相对定位找到内部真实input节点 var currencyWrapper = driver.FindElement(By.CssSelector("app-currency-input[name='InvoiceAmount']")); var realInput = currencyWrapper.FindElement(By.TagName("input")); // 先激活输入框再输入内容 realInput.Click(); realInput.SendKeys("100");
方案2:JS修改值+触发Angular绑定事件(方案1无效时使用)
如果原生输入框仍报键盘不可达错误,用JS修改值后主动触发Angular需要的输入变更事件即可:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver; var currencyWrapper = driver.FindElement(By.CssSelector("app-currency-input[name='InvoiceAmount']")); var realInput = currencyWrapper.FindElement(By.TagName("input")); // 可选:如果输入框有readonly/disabled属性,先移除限制 js.ExecuteScript("arguments[0].removeAttribute('readonly'); arguments[0].removeAttribute('disabled');", realInput); // 修改值后触发input、change事件通知Angular更新绑定 js.ExecuteScript("arguments[0].value = '100';", realInput); js.ExecuteScript("arguments[0].dispatchEvent(new Event('input', { bubbles: true }));", realInput); js.ExecuteScript("arguments[0].dispatchEvent(new Event('change', { bubbles: true }));", realInput);
补充说明
如果组件有特殊的输入拦截逻辑,也可以借助剪贴板完成输入:先把目标值写入系统剪贴板,再对输入框发送Ctrl+V粘贴快捷键即可。
内容的提问来源于stack exchange,提问作者Tobi Akin
相关产品推荐
相关产品推荐

