Другой вариант - очистить текстовый элемент с помощью Javascript. Из-за проблем, возникающих в определенных ситуациях параллельного тестирования, я перестал полагаться на функцию SendKeys некоторое время назад. Вместо этого я использую эти функции сейчас, чтобы установить определенный текст:
private void SetText(IWebElement element, string text, bool clearOldText)
{
// Clear old text if needed
if (clearOldText)
{
LogInfo("Clearing " + element.ToString() + @" from any text.");
SetElementValue(element, "");
}
element.Click();
SetElementValue(element, text);
}
public string SetElementValue(IWebElement element, string value)
{
ScrollToElement(element);
PaintElement(element, "yellow");
var exec = (IJavaScriptExecutor)this;
var script = @"
var el = arguments[0];
el.value = '" + value + @"';
try
{
if (""createEvent"" in document) {
var evt = document.createEvent(""HTMLEvents"");
evt.initEvent(""change"", false, true);
el.dispatchEvent(evt);
}
else
el.fireEvent(""onchange"");
}
catch(err){ return err; }
return ""Javascript executed."";
";
LogInfo("Setting value to '" + value + "' for " + element.ToString());
var result = exec.ExecuteScript(script, element);
Recorder?.AddScreenshot();
return result.ToString();
}
Лично мне немного не нравится жестко закодированный javascript, но он всегда делал свою работу надежно. «SetElementValue» вызывается дважды в этом коде, чтобы обеспечить правильную обработку определенных событий в моих тестах: в других случаях это может не потребоваться.