Javascript 使用JSE(Selenium c#)设置值和文本之间的差异

Javascript 使用JSE(Selenium c#)设置值和文本之间的差异,javascript,html,selenium,selenium-chromedriver,Javascript,Html,Selenium,Selenium Chromedriver,我正在使用IjavaScriptExecutor设置属性值。 但有时,我的文本框包含我设置的值,但它没有显示为文本。因此,从字面上来说,它向某些文本框正常发送输入,而向某些文本框不正常发送输入。它只是设置值。但不显示文本。 为什么会这样 代码: public static void SendKeysJavaScript(IWebElement element, string message) { //Instance of IJavaScriptExecutor cla

我正在使用IjavaScriptExecutor设置属性值。 但有时,我的文本框包含我设置的值,但它没有显示为文本。因此,从字面上来说,它向某些文本框正常发送输入,而向某些文本框不正常发送输入。它只是设置值。但不显示文本。 为什么会这样

代码:

 public static void SendKeysJavaScript(IWebElement element, string message)
    {
        //Instance of IJavaScriptExecutor class
        var js = (IJavaScriptExecutor) Program.Driver;
        //Local variable holding formated string
        var stringFormat = string.Format("arguments[0].setAttribute('value','{0}')", message);
        //Send "message" to the "element"
        js.ExecuteScript(stringFormat, element);
        //confirm that input has been sent
        GetSentInput(element, message);
    }

同时,我注意到,即使清除了文本框,文本框仍然保留值。这可能是我无法将输入发送到同一文本框两次的原因之一,重置值的方法是什么?

C的
.text
属性返回innertext,这是预期的返回值,与纯文本浏览器显示的值大致相同。。看

另一方面,
value
是这里的属性,至少是您使用的方式。所以唯一的操作方法就是使用JavaScript执行器

现在,深入研究这个问题,如果我理解正确,
clear()
方法不会触发应用程序预期的事件更改,因此,您看不到任何更改。要触发更改,有多个选项,包括我从
Selenium
Java源代码中获取的选项

/** *如果此元素是文本输入元素,则将清除该值。对其他方面没有影响 *元素。文本输入元素是INPUT和TEXTAREA元素。 * *请注意,此事件触发的事件可能与您预期的不同。特别是,我们没有 *触发任何键盘或鼠标事件。如果要确保键盘事件被触发,请考虑 *使用类似于{@link#sendKeys(CharSequence…}的内容和退格键。确保 *您得到一个更改事件,考虑调用{@ Link LyssEdKEY(字符序列…)}。 *使用tab键。 */


void clear()

在自动化场景时,您希望尽可能像用户一样执行操作。在这种情况下,应该使用.SendKeys()而不是JSE。使用JSE可以直接绕过“正常”用户行为修改元素,并可能导致问题。@JeffC有趣的是,有人告诉我使用JSE,因为它可以显著提高性能,而且它始终是向浏览器发送输入的更好方式。我从来没有听说过JSE更快。我的猜测是,要么差不多,要么稍微慢一点。JSE适用于需要对页面执行JavaScript的情况。它不打算执行“正常”用户任务。这就是WebDriver的作用。@Mystia使用JS进行端到端测试是一种糟糕的行为。您的测试应该验证用户旅程,但这里不是这样。@Arran谢谢您,不,您是对的,这里不是这样。我最近开始使用硒元素,我正在探索硒元素的功能,但对它知之甚少。但我很高兴至少我问了这个问题,否则我仍然相信JS是一个很好的选择。。