В текстовые поля браузера внести данные

Egorich
Дата: 25.12.2009 12:43:15
Добрый день.

Подскажите пожалуйста.
Есть в запущенном браузере страница. Как мне из программы в текстовые поля браузера внести данные ФИО человека.

Есть вариант сохранять страницу на диск, затем открыть, и найдя текстовые поля по имени:
<input type=text name=firstname value="введите ваше имя" >, допустим в этом случае "firstname" подставить необходимое значение для имени по умолчанию : value
Затем открыть эту сохранённую страницу в браузере.

Возможно есть варианты проще?
Спасиббо.
vagner
Дата: 25.12.2009 13:07:47
Egorich,

есть. Подключите к проекту Micosoft.mshtml.dll. И тогда
			object dom = wb.Document.DomDocument;
			if ( dom == null ) return LoginResult.InnerError;
			HTMLDocumentClass hdoc = dom as HTMLDocumentClass;
			if ( hdoc == null ) return LoginResult.InnerError;

			//	заполним логин
			IHTMLElementCollection ec = hdoc.getElementsByName ( "userid" );
			if ( ( ec != null ) && ( ec.length > 0 ) )
				foreach ( HTMLInputElementClass he in ec ) he.value = UserName;
			else return LoginResult.BadLoginPage;
			//	заполним пароль
			ec = hdoc.getElementsByName ( "password" );
			if ( ( ec != null ) && ( ec.length > 0 ) )
				foreach ( HTMLInputElementClass he in ec ) he.value = Psw;
			else return LoginResult.BadLoginPage;

			//	а теперь нажмем кнопку
			ec = hdoc.forms;
			if ( ( ec != null ) && ( ec.length > 0 ) )
				foreach ( HTMLFormElementClass hf in ec )
				{
					if ( hf.name == "LoginPage" )
					{
						hf.IHTMLFormElement_submit ( );
						break;
					}
				}
			else return LoginResult.BadLoginPage;


Как я узнал про userid, password итд? Признаюсь, тупо рассмтривая html страницы.
Egorich
Дата: 25.12.2009 15:27:25
Благодарен за пример:)
Есть от чего оттолкнуться.

Если позволяет время, прошу помочь конкретнее:
1. Программе надо проверить запущен ли браузер iexplore.exe;
2. Открыта ли в нём страница с соответсвующим путём.
3. Как получить из него
object dom = wb.Document.DomDocument;
необходимый документ;
4. Можно ли в него записать данные, изменив таким образом значение пользователя в странице;

Благодарю.
Egorich
Дата: 26.12.2009 11:59:09
1. Нашёл все Internet Explorer - ы в памяти так:
//Получаем все Internet Explorer в памяти
            Process[] procs = Process.GetProcessesByName("IEXPLORE");

Создать Internet Explorer и совершить в нём соответсвующую замену можно так:
            using SHDocVw;
            using mshtml;
            using System.Diagnostics;

            System.ComponentModel.Container components = null;
            InternetExplorer m_IExplorer = null;
            IWebBrowser2 m_WebBrowser = null;
            IHTMLDocument3 m_HTMLDocument = null;
            IHTMLElement m_HTMLElement = null;


            try
            {
                m_IExplorer = new SHDocVw.InternetExplorer();
                m_WebBrowser = (IWebBrowser2)m_IExplorer;
                m_WebBrowser.Visible = true;
                m_WebBrowser.GoHome();

                m_HTMLDocument = (IHTMLDocument3)m_WebBrowser.Document;
                m_HTMLElement = m_HTMLDocument.getElementById("FIO");


                if (m_HTMLElement != null)
                {
                    m_HTMLElement.innerText = "Василий Пупкин";
                    m_HTMLElement.click();
                }

            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
Подскажите, как можно сделать, чтобы я уже имел доступ к запущенным процессам IEXPLORER?

Благодарю Вас.
Василий Викторович
Дата: 26.12.2009 12:35:06
Egorich, а для чего вводить в текстовые поля браузера данные? что б потом послать запрос к серверу? тогда проще сразу через HttpWebRequest/HttpWebResponse работать
(или на крайний случай используй компонент WebBrowser)
Egorich
Дата: 26.12.2009 13:47:33
Стоит в библиотеке терминал. Подходит читатель и даёт сканеру прочитать его читательский - если в Internet Explorer, открыта страница в которой, есть поле с именем фамилии человека - она заполняеться из базы данных - человеку ненадо вводить своё ФИО в соответсвующие поля.
Вот такую программу в трей мне надо написать.

Благодарю.
vagner
Дата: 28.12.2009 11:20:05
Egorich,

насчет
object dom = wb.Document.DomDocument; 
. Я сразу не сказал, но на нужную мне страницу прога идет сама, для этого используется компонент WebBrowser, экземпляр которого и получил имя wb.
Egorich
Дата: 28.12.2009 17:19:07
vagner, благодарю за помощь.
Подскажи пожалуйста, можно ли сделать, чтобы я получил объект WebBrowser из уже запущенного процесса IEXPLORER?

Вопрос решил пока так: только созданием WebBrowser из кода. Когда невозможно получить ссылку на открытый DomDocument в браузере, (т.е пользователь закрыл браузер) я получаю exception, давлю его - я открываю новый браузер.

Благодарю.
Egorich
Дата: 28.12.2009 17:23:48
vagner, использовал ли ты в компоненте WebBrowser события?
У меня ошибка при присвоении обработчика событий, вопрос тут: http://www.sql.ru/forum/actualthread.aspx?tid=723502

Почему-то линки не получаються в постах сделать :)

Благодарю.
vagner
Дата: 28.12.2009 17:40:06
Egorich,

подключиться к запущенному экземпляру - тут я пас. Могу только высказать одно соображение.
Насколько мне известно, эксплорер является СОМ-сервером. И, конечно, Вам не удастся вытянуть из эксплорера WebBrowser, поскольку это является компонентом .Net, но Вам и не нужен этот компонент, Вам нужен HTMLDocumentClass, а вот его (или некий его аналог), наверняка вытащить можно.
Правда, я не уверен, что через СОМ Вам удастся подключиться к любому из запущенных эксплореров.

У меня есть статейка Using Internet Explorer from .NET (не попадалась Вам такая?), вот выдрежка из нее:

The procedure for including the Internet Explorer object in your application differs depending on which version of Visual Studio .NET you are using. After starting a new windows forms project, users of Visual Studio .NET 2002 should right click on their toolbox and select “Customize toolbox”, click “COM components” then select “Microsoft Web Browser”. Users of Visual Studio .NET 2003 should right click on their toolbox and select “Add/Remove Items”, and then follow the same procedure as mentioned above. In Visual Studio .NET 2005, you do not need to add the web browser to the toolbox, just drag the “WebBrowser” control to the form.

An important distinction between the Internet Explorer object used in Visual Studio .NET 2002/03 and the 2005 version is that, the latter uses a native .NET class to interact with Internet Explorer, whereas the former uses a .NET wrapper around a COM (Common Object Model) object. This creates some syntactic differences between how Internet Explorer is used within .NET 2.0 and .NET 1.x.

Далее в статье идут примеры по использованию WebBrowser, но вводная часть наводит на мысль на то, что и в том и в другом случае все примерно одинаково.