IFrame в веб-драйвере. Ввод в RTE

У меня на странице есть редактор форматированного текста, и там нужно напечатать какой-то текст. Я написал решение, но, похоже, оно работает только с перерывами. Вот что я уже пробовал:

        var iframe = _driver.SwitchTo().Frame(Driver.FindElement(By.XPath(xpath)));
        var editor = iframe.FindElement(By.XPath("//*"));
        for (var i = 1; _driver.FindElement(By.XPath("//*")).Text == String.Empty; i++)
        {
            switch (i)
            {
                case 1:
                    editor.SendKeys(text);
                    break;
                case 2:
                    editor.SendKeys(Keys.Control + "a");
                    editor.SendKeys(Keys.Delete);
                    editor.SendKeys(text);
                    break;
                case 3:
                    editor.Click();
                    editor.SendKeys(text);
                    break;
                case 4:
                    throw new Exception("Rich Text Editor can't be reached");
            }
            editor.SendKeys(text);

В цикле я проверяю, набран ли текст. Если это не так, я пробую разные случаи. Кроме того, если я попытаюсь выполнить editor.Clear();, я постоянно получаю сообщение об ошибке «Элемент должен быть доступен для редактирования пользователем, чтобы его можно было очистить». Я могу печатать (время от времени), но не могу очистить (постоянно). Итак, вопрос в том, как стабилизировать этот код?


person Vlad Titov    schedule 20.09.2012    source источник
comment
Исключение какого типа выбрасывается случайным образом? Перед выполнением любой операции убедитесь, что элемент доступен в DOM. Можно ли очистить содержимое вручную в редакторе Rich Text Editor?   -  person Santoshsarma    schedule 20.09.2012
comment
Он просто молча не печатает, никаких исключений из-за этого. Форма полностью интерактивна вручную.   -  person Vlad Titov    schedule 21.09.2012


Ответы (1)


Хорошо, я нашел решение. Работает через ДОМ. currentInstance получает сфокусированную текстовую область, поэтому сначала у меня есть метод click.

editor.Click();
IJavaScriptExecutor js = (IJavaScriptExecutor) _driver;
js.ExecuteScript("CKEDITOR.currentInstance.insertText('text')")
person Vlad Titov    schedule 21.09.2012
comment
также есть window.frames[0], но у меня это почему-то не сработало. - person Vlad Titov; 26.09.2012