5

我有一个文本框,它具有 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);

提前致谢。

4

3 回答 3

6

您可能正在查看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();
 }
}
于 2013-11-27T03:41:46.100 回答
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 可以正常工作。

于 2013-11-27T08:06:07.923 回答
0

JS 注入一直不是一个明智的解决方案,我建议您使用@Faiz。此外,为特定场景或特定页面编写代码会给您在维护阶段带来巨大的痛苦。

于 2013-12-03T07:14:40.203 回答