Проблема с AppendText и TypeText с IE9 (особенно с событиями изменения) - PullRequest
2 голосов
/ 17 августа 2011

Так что недавно мы заставили наше приложение работать в режиме IE9, и с тех пор текст WatiN, AppendText, в сочетании с TriggerClientChange (показанным ниже) больше не запускает JS на странице.

Здесьситуация ... Это текстовое поле, которое используется для быстрого поиска в нашем приложении.OnFocus открывает меню, а при наборе текста выполняет поиск в БД и заполняет меню выбора результатами.В течение последних двух лет это работало нормально с использованием AppendText и TypeText с этим методом. TriggerClientChange

    public static void TriggerClientChange(this Element element)
    {
        //var Id = element.Id.Replace("[", @"\\[").Replace("]", @"\\]");
        if (String.IsNullOrEmpty(element.Id))
        {
            element.Id = "x" + Guid.NewGuid().ToString("N");
        }

        string selector = "[id=\"" + element.Id + "\"]";

        //if (element.Name == null)
        //    throw new ElementExtensionException("element: " + element.ToString() + " doesn't exist.");

        if (element is CheckBox)
        {
            selector += ":checkbox";
        }
        element.DomContainer.WaitForComplete();
        element.DomContainer.Eval("var elt = window.$('" + selector + "'); if(elt.length > 0) { elt.trigger('change'); }");
        element.DomContainer.WaitForAjaxComplete();
        element.DomContainer.WaitForComplete();
    }

Теперь, когда мы поддерживаем IE9 и HTML5, мы решили использовать IE9 и стандарты.С тех пор JS не запускается, когда вызывается TriggerClientChange, который запускает JS, когда значение вводится в текстовое поле поиска.Мы пробовали разные перестановки .change безуспешно, например:

    public static void ForceChange(this Element element)
    {
        element.DomContainer.Eval(String.Format("$({0}).change();", element.GetJavascriptElementReference()));
    }
    public static void ForceChange(this Element element)
    {
        element.DomContainer.Eval("$('#" + element.Id + "').change();");
    }

Ни один из них не дает результата, как это было раньше.Ниже приведен метод QuickSearch, который вводит значение в текстовое поле, которое работало в течение длительного времени, пока мы не принудительно установили стандарты IE9

    internal void SetQuickSearchTextbox(string val)
    {
        this.Browser.TextField("navBarQuickContactSearch").AppendText(val);
        this.Browser.TextField("navBarQuickContactSearch").TriggerClientChange();
        this.Browser.WaitForAjaxComplete();

        Thread.Sleep(5000);

        ElementCollection results = this.Browser.Div(Find.ByClass("ac_results")).ElementsWithTag("li");
        results[1].Click();
    }

Наконец, это TypeText

    protected virtual void SendKeyPresses(string value)
    {
        var length = value != null ? value.Length : 0;

        if (TextField.MaxLength != 0 && length > TextField.MaxLength)
        {
            length = TextField.MaxLength;
        }

        for (var i = 0; i < length; i++)
        {
            var character = value[i];

            FireKeyDown(character);
            FireKeyPress(character);
            FireKeyUp(character);
        }
    }

    protected virtual void FireKeyUp(char character)
    {
        TextField.KeyUp(character);
    }

    protected virtual void FireKeyPress(char character)
    {
        TextField.KeyPress(character);
    }

    protected virtual void FireKeyDown(char character)
    {
        TextField.KeyDown(character);
    }

Краткое описание: этиработали, пока IE9 не был вынужден.Да, это работает при ручном наборе текста в текстовом поле, но теперь сценарии не меняют элемент, как раньше.Любая помощь будет великолепна.

1 Ответ

0 голосов
/ 18 августа 2011

Мы исправили проблему с помощью следующего фрагмента.Он имитирует отсутствующее событие jquery:

var evt = jQuery.Event("keydown");   
evt.keyCode = $.ui.keyCode.RIGHT;   
$('input.ac_input').focus().val('SOME TEST TEXT').trigger(evt);

Это обходной путь, который запускается через Browser.Eval.Изменения в ie9mode, которые его сломали, до сих пор не определены.

...