Delphi TWebBrowser修改文本框的值。

5

我在更改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>

如果您能向我展示如何更改中的值,我将非常感激。谢谢阅读和所有回复。

2
WebBrowser1.OleObject.Document.getElementByID('register_vv[q][71]').Value:='test'; 看起来可以工作,是吗? - Sertac Akyuz
不行,它不起作用。我收到一个错误消息:“自动化对象不支持'value'方法”。 - rookie Bounty
奇怪,我从一个测试应用程序中复制粘贴了这行代码(XE2-ie8-w7)。 - Sertac Akyuz
你使用的是哪个版本? - Zeina
如果你的问题是针对我的,我正在使用Delphi 2009。 - rookie Bounty
@SertacAkyuz,你的代码也应该可以工作。请查看我的修改。 - kobik
3个回答

7

试试这个:

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标准模式和之前的模式中,该方法对IDNAME属性执行不区分大小写的匹配,这可能会产生意外结果
因此,如果您的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 方法(因此出现错误消息“自动化对象不支持方法'value'”)。请注意保留 HTML 标签。

+1(已经)并感谢您解决了我一些困惑。 - Sertac Akyuz

0

我必须通过触摸按钮允许文本输入到活动元素中,以下方法可行:

    procedure TMyForm.SendKey(key : string);
    var
    Doc: IHTMLDocument2;
    InputBox : IHtmlInputElement;
    begin
      Doc := WebBrowser1.Document as IHTMLDocument2;

      if Doc.activeElement.isTextEdit then
      begin
        InputBox := Doc.activeElement as IHtmlInputElement;
        InputBox.value := InputBox.value+key;
      end;
    end;

0

您的getElementById('verification_control_0')将获取DIV元素,该元素没有'value'属性。

您的文本框没有ID。为了测试,请将'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';

问题在于该网站不属于我。通常情况下,如果某个值有id,我获取它的值就没有问题。我希望Delphi不仅限于只能使用getelementbyid。 - rookie Bounty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接