Delphi Twebbrowser изменяет значение текстового поля.

Мне трудно изменить значение текстового поля в twebbrowser. Я пробовал WebBrowser1.OleObject.Document.getElementById('verification_control_0').value := 'mytext'; и несколько других методов, но, похоже, они не работают.

Код веб-сайтов:

 <div id="verification_control_0" class="verification_control">
 <div class="smalltext">
 What are the first 3 letters of our website's name?:<br />
 <input type="text" name="register_vv[q][71]" size="30" value=""  tabindex="6"    class="input_text" />
  </div>
 </div>

Если бы вы могли показать мне, как изменить значение в <input type="text" name="register_vv[q][71]" size="30" value="" tabindex="6" class="input_text" />, я был бы очень признателен. Спасибо за чтение и все ответы.


person rookie Bounty    schedule 20.01.2013    source источник
comment
WebBrowser1.OleObject.Document.getElementByID('register_vv[q][71]').Value:='test'; вроде работает, не так ли?   -  person Sertac Akyuz    schedule 21.01.2013
comment
Нет, не работает. Я получаю сообщение об ошибке «Значение метода» не поддерживается объектом автоматизации.   -  person rookie Bounty    schedule 21.01.2013
comment
Странно, я скопировал эту строку из тестового приложения сюда (XE2-ie8-w7)   -  person Sertac Akyuz    schedule 21.01.2013
comment
Какую версию ты используешь?   -  person Zeina    schedule 21.01.2013
comment
Если ваш вопрос адресован мне, я использую delphi 2009.   -  person rookie Bounty    schedule 21.01.2013
comment
@SertacAkyuz, ваш код тоже должен работать. см. мое редактирование.   -  person kobik    schedule 21.01.2013


Ответы (2)


Попробуй это:

procedure TForm1.Button1Click(Sender: TObject);
var
  col: IHTMLElementCollection;
  el: IHTMLInputElement;
begin
  col := (WebBrowser1.Document as IHTMLDocument3).getElementsByName('register_vv[q][71]');
  if col.length <> 0 then
  begin
    el := col.item(0, 0) as IHTMLInputElement;
    el.value := 'mytext';
  end;
end;

В стандартном режиме IE8 getElementById выполняет сопоставление с учетом регистра ID только атрибут.
В стандартном режиме IE7 и предыдущих режимах этот метод выполняет сопоставление атрибутов ID и NAME без учета регистра, что может привести к неожиданные результаты.

Итак, если ваш TWebBrowser работает со стандартным режимом IE7, и предыдущие режимы getElementById также должны работать:

procedure TForm1.Button2Click(Sender: TObject);
var
  el: IHTMLElement;
  inputElement: IHTMLInputElement;
begin
  el := (WebBrowser1.Document as IHTMLDocument3).getElementById('register_vv[q][71]');
  if Assigned(el) then
    if Supports(el, IID_IHTMLInputElement, inputElement) then
      inputElement.value := 'mytext';
end;

Использование коллекции getElementsByName для поиска элементов по NAME должно быть предпочтительным решением.


РЕДАКТИРОВАТЬ: первый комментарий @SertacAkyuz:

WebBrowser1.OleObject.Document.getElementByID('register_vv[q][71]').Value:='tes‌​t';

Я почти уверен, что OP не тестировал ваш код (который должен работать по умолчанию, если OP явно не изменил режим просмотра IE), а вместо этого использовал getElementByID('verification_control_0') - это DIV элемент и не поддерживает метод value. (отсюда и сообщение об ошибке "Method 'value' not supported by automation object").

person kobik    schedule 21.01.2013
comment
+1 (уже) и спасибо, что снял с меня некоторую путаницу. - person Sertac Akyuz; 21.01.2013

Ваш getElementById ('verify_control_0') получит элемент DIV, который не имеет значения 'value'.

У вашего текстового поля нет идентификатора. Для теста измените атрибут 'name' на 'id', как это

<input type="text" id="register_vv[q][71]" size="30" value=""  tabindex="6" class="input_text" />

и измените свой код вот так

WebBrowser1.OleObject.Document.getElementById('register_vv[q][71]').value := 'mytext';
person Matthias Alleweldt    schedule 21.01.2013
comment
Проблема в том, что этот сайт мне не принадлежит. Обычно у меня нет проблем с получением значения по его идентификатору, если он есть. Я надеюсь, что delphi не ограничивается только getelementbyid. - person rookie Bounty; 21.01.2013