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

时间:2013-04-30 10:59:50

标签: 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">

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

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

element.Clear();
element.SendKeys(value);

提前致谢。

3 个答案:

答案 0 :(得分: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();
 }
}

答案 1 :(得分:2)

我使用以下JavaScript代码来克服此问题。

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

上面的代码停止了页面加载,它运行正常。

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

答案 2 :(得分:0)

JS注入并不是一个明智的解决方案,我建议你选择@Faiz.Also,编写特定场景或特定页面的代码会给你带来巨大的维护阶段痛苦。