具有类型号的输入框的Html如下
<input id="noofItems" type="number" max="99" min="1" class="form-control" data-bind="value: noofItems" />
在我的硒测试中,我有一个在输入框中输入数字的代码
[FindsBy(How = How.Id, Using = "noofItems"), CacheLookup]
private HtmlElement ItemsInput;
ItemsInput.WaitForVisible().SendKeys(Keys.Control + "a");
ItemsInput.WaitForVisible().SendKeys(Keys.Control + "x");
ItemsInput.WaitForVisible().SendKeys("2");
ItemsInput.WaitForVisible().SendKeys(Keys.Return); // need this to reload dom
ItemsInput.Click();
默认情况下,输入框的值为1,但当测试运行时,我想更改为2。但有时值会更改为12而不是2。
如何解决此问题?我在用彩色打印机。
WaitForVisible()
方法的更多信息将有助于我们以更好的方式调试问题。然而,当您将SendKeys()
调用到<input>
标记时,理想情况下需要为ElementToBeClickable()
引入WebDriverWait。
同样,不使用Id
,您可以使用以下定位器策略之一:
-
CssSelector
:[FindsBy(How = How.CssSelector, Using = "input.form-control#noofItems"), CacheLookup] private HtmlElement ItemsInput;
-
XPath
:[FindsBy(How = How.XPath, Using = "//input[@class='form-control and @id='noofItems'']"), CacheLookup] private HtmlElement ItemsInput;
最后,不使用Keys.Control + "a"
和Keys.Control + "x"
,您可以使用经过验证且稳健的Clear()
方法,如下所示:
ItemsInput.WaitForVisible().Click(); //preferably wait for ElementToBeClickable()
ItemsInput.Clear();
ItemsInput.SendKeys("2");
ItemsInput.SendKeys(Keys.Return);
PS:元素在可点击后返回后,您可以同时调用Clear()
和SendKeys()
,而无需任何其他等待程序。
如果字段为空,则返回默认值。你可以尝试在不删除的情况下更改它
ItemsInput.WaitForVisible().SendKeys(Keys.Control + "a");
ItemsInput.WaitForVisible().SendKeys("2");
作为解决方案,您还可以使用JavaScript
设置value
属性
driver.ExecuteScript("arguments[0].setAttribute('value', arguments[1]);", ItemsInput, 2);