Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WebBrouser No Element 
V
    Опции темы
neic
Дата 14.4.2011, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



Есть страница на которой висит ссылка New Blog, она вызывает js: load_editor('edit_blog'). После чего появляются (грузятся) новые элементы на страницу, но сама страница не перегружается. Так вот мне нужны несколько элементов которые загрузились после вызова js.

Вот код:
Код

            webBrowser1.Navigate("javascript:load_editor('edit_blog');");
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                try { webBrowser1.Document.All["title"].InnerText = "Тема"; }
                catch {}
            }
            webBrowser1.Document.All["title"].InnerText = "Тема";
            webBrowser1.Document.All["rte1_content"].InnerText = "Сообщение";

Вызываю js, условие цикла пока страница полностью не загрузиться то крутим цикл, и вот на этой строчке:
Код

webBrowser1.Document.All["title"].InnerText = "Тема";

Начинается трабла, WebBrouser просто не видит этого элемента. Выкидывает такую ошибку:
Цитата

Ссылка на объект не указывает на экземпляр объекта.

Хотя на странице он существует, смотрел через инспектора Опёры.

Визуально я в окне WebBrouser'a вижу этот элемент, а программно не добраться до него.
Может нужно метод перерисовки элементов вызывать, что бразуер увидел программно эти элементы...я так и не разобарлся с этим, поэтому решил обратиться к Вам.

И еще одна трабла в том, что страница постоянно грузиться и 5 минут, и 10 минут и далее, т.е. полностью не может загрузиться. Но это другая проблема, если доступ к title будет, то можно просто break поставить и выйти из цикла.

Это сообщение отредактировал(а) neic - 14.4.2011, 01:40
PM MAIL WWW ICQ Skype   Вверх
diadiavova
Дата 14.4.2011, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Да по моему к этому элементу так не достучишься. У него есть свойство text, в скрипте надо действовать через него. В коде на шарпе можно сделать как-то так
Код

dynamic title = webBrowser1.Document.All["title"].DomElement;
title.text = "Тема";

А чтоб не писать бесконечный цикл, этот код надо поместить в обработчик события Navigated.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
neic
Дата 14.4.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



diadiavova
Всё равно не работает. 

Срывается на catch, т.е. исключение вызывается.

Код

            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete || webBrowser1.IsBusy == false)
            {              
                Application.DoEvents();
                try 
                { 
                    //webBrowser1.Document.All["title"].InnerText = "Тема";
                    dynamic title = webBrowser1.Document.All["title"].DomElement;
                    title.text = "Тема";
                    break;
                }
                catch {}
            }


Это сообщение отредактировал(а) neic - 14.4.2011, 10:39
PM MAIL WWW ICQ Skype   Вверх
diadiavova
Дата 14.4.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



neic, я не обратил внимания на то, как ты получаешь доступ к элементу, так его можно получить только если у него id="title".
Код

dynamic title = this.webBrowser1.Document.GetElementsByTagName("title")[0].DomElement;

И насчет выполнения этого кода в обработчике соответствующего события тоже подумай.

Это сообщение отредактировал(а) diadiavova - 14.4.2011, 11:35


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
neic
Дата 14.4.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



diadiavova
Сделал как ты и сказал, объект вроде как находится программно, но при внесении в элемент текста ни чего не получается.
Пробовал еще value вставить вместо text, вызывается ошибка.
Код

        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            if (state == 1)
            {
                dynamic title = this.webBrowser1.Document.GetElementsByTagName("title")[0].DomElement;
                title.text = "Тема";
            }
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (state == 1)
            {
                dynamic title = this.webBrowser1.Document.GetElementsByTagName("title")[0].DomElement;
                title.text = "Тема";
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            dynamic title = this.webBrowser1.Document.GetElementsByTagName("title")[0].DomElement;
            title.text = "Тема";
        }
 
Когда меняю text на value, то вылетает такая ошибка:
Цитата

"mshtml.HTMLTitleElementClass" не содержит определения для "value"

На всякий случай скидываю htmlкод объекта:
Код

<input type="text" name="title" value=""/>


Это сообщение отредактировал(а) neic - 14.4.2011, 15:41
PM MAIL WWW ICQ Skype   Вверх
diadiavova
Дата 14.4.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(neic @  14.4.2011,  16:38 Найти цитируемый пост)
На всякий случай скидываю htmlкод объекта:

Это надо было сделать сразу, а не на всякий случай. Я тебя вообще неправильно понял. Я искал элемент <TITLE></TITLE>, а не инпут. В твоем случае, для нахождения элемента по имени надо сделать так
Код

dynamic doc = webbrowser1.Document.DomDocument;
dynamic input = doc.getElementsByName("title")[0]
input.value = "Тема";

При этом индекс 0 для того случая, когда элемент с таким именем либо единственный, либо первы в документе. Другой вариант: можно найти элементы инпут по имени тега и отфильтровать коллекцию так как надо, например так
Код

HtmlElemntCollection inputs = webbrowser1.Document.GetElementsByTagName("input");
var input = (from HtmlElement inp in inputs 
                   where inp.GetAttribute("type") == "text" && inp.GetAttribute("name") == "title"
                    select inp )[0];

В данном случае мы фильтруем инпуты по атрибутам и берем первый в коллекции. Если такой окажется не единственным, то надо взять тот, который нужен.

Это сообщение отредактировал(а) diadiavova - 14.4.2011, 17:00


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
neic
Дата 14.4.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



diadiavova
Код:
Код

dynamic doc = webbrowser1.Document.DomDocument;
dynamic input = doc.getElementsByName("title")[0];
input.value = "Тема";

Вызывает ошибку:
Цитата

Не удается выполнить привязки исполняющей среды по нулевой ссылке


input=null

PM MAIL WWW ICQ Skype   Вверх
diadiavova
Дата 14.4.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



У меня не вызывает, пример в аттаче.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  settitle.rar 53,70 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
neic
Дата 15.4.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



diadiavova
Для статичных там всё ещё проще можно сделать, как в твоем случае.
А вот когда на странице задействован AJAX и элементы появляются после вызова js, то вот тут проблема возникает.

Я склоняюсь к тому, что должна быть функция которая обновляет список элементов не перезагружая страницу в WebBrouser. Либо задействовать POST или GET, но как хз.
PM MAIL WWW ICQ Skype   Вверх
diadiavova
Дата 15.4.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



neic, На самом деле, не имеет значения, как появился элемент на странице: благодаря разметке, или динамически. Другой вопрос, что на момент запроса его может просто не существовать.
Цитата(neic @  15.4.2011,  01:07 Найти цитируемый пост)
 то вот тут проблема возникает.

Так в чем она? Поймать момент когда появляется элемент? Это можно сделать, отловив событие onpropertychange родительского контейнера, оно возникает при изменении любого свойства, в том числе innerHTML, а стало быть всякий раз когда добавляется новый элемент происходит это событие.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
neic
Дата 15.4.2011, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



diadiavova
Смотри я вызвал скрипт, подождал когда страница полностью загрузиться и после полной загрузки страницы нажимаю кнопку и вызывается ошибка, т.е. в самом браузере как будто не обновился исходный код.

Прилагаю скрины.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Desktop.rar 406,90 Kb
PM MAIL WWW ICQ Skype   Вверх
neic
Дата 15.4.2011, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 1
Всего: 7



Всё я решил проблему =)
Нужно было просто идти на страницу фрейма выползающего и не пудрить себе мозги.

Спасибо diadiavova за помощь и терпение =)

Это сообщение отредактировал(а) neic - 15.4.2011, 08:13

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Desktop.rar 406,90 Kb
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2193 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.