使用c#selenium webdriver将文本发送到具有onkeypress事件的文本框时遇到问题

Nar*_*ren 5 selenium-webdriver

我有一个文本框,它有onkeypress事件,当值输入文本框时执行页面渲染.在这里,我使用selenium webdriver来填充文本框.在填充文本框之前,我使用的是textbox.clear().因此调用onkeypress事件并呈现页面.因此从webdriver实例中删除了文本框控件.

发生onkeypress事件后,该元素未在webdriver中列出.这是特定文本框的源标记:

<input id="ctl00_ctl00_ContentPlaceHolder1_cphMainContent_wzrDREvent_txtNftnTime" class="OpCenter_DateBox" type="text" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$ContentPlaceHolder1$cphMainContent$wzrDREvent$txtNftnTime\',\'\')', 0)" name="ctl00$ctl00$ContentPlaceHolder1$cphMainContent$wzrDREvent$txtNftnTime">
Run Code Online (Sandbox Code Playgroud)

你可以看到这里使用的onkeypress事件.请提出一些填写文本框中值的建议.

我使用以下代码填充我的文本框:

element.Clear();
element.SendKeys(value);
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Fai*_*aiz 5

您可能正在查看onchange执行时被触发的事件clear().

解决方案是在一个操作中清除和设置文本,而不是在单独的调用中.你可以通过使用Actions类来实现,下面的C#扩展方法显示了如何.

一旦您从文本字段元素中失去焦点,onchange事件就会触发.

public static class WebElementExtensions
{
 public void ClearAndSetText(this IWebElement element, string text)
 {
    Actions navigator = new Actions(driver);
        navigator.Click(element)
            .SendKeys(Keys.End)
            .KeyDown(Keys.Shift)
            .SendKeys(Keys.Home)
            .KeyUp(Keys.Shift)
            .SendKeys(Keys.Backspace)
            .SendKeys(text)
            .Perform();
 }
}
Run Code Online (Sandbox Code Playgroud)


Nar*_*ren 2

我使用了以下 JavaScript 代码来解决这个问题。

if (!(webDriver.GetType().FullName).Contains("IE"))
            {
                // To stop the page postback in Firefox and chrome
                ((IJavaScriptExecutor)webDriver).ExecuteScript("window.stop();");
            }
Run Code Online (Sandbox Code Playgroud)

上面的代码停止了页面加载并且它工作得很好。

但是,在 Firefox 23.0 及更高版本中,此 JavaScript 不起作用。否则,对于 Chrome 31.0 和 IE 9,JavaScript 可以正常工作。