TWebBrowser自动登录

时间:2017-08-09 15:49:53

标签: delphi twebbrowser delphi-10.2-tokyo

我使用以下代码在网站登录表单的相应字段中填写用户名和密码。

var

Doc: IHTMLDocument2;
I: Integer;
Element: OleVariant;
Elements: IHTMLElementCollection;
Sub: Variant;

begin

Doc := WebBrowser1.Document as IHTMLDocument2;
Elements := Doc.All;
for I := 0 to Elements.length - 1 do begin
Element := Elements.item(I, varEmpty);

if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then begin
if (Element.name = 'user') then Element.value := 'theusername';

if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then begin
if (Element.name = 'passwrd') then Element.value := 'thepassword';
end;
end;
Sub := WebBrowser1.Document;
Sub.frmLogin.Submit();
end;
end;

相关领域的信息:

enter image description here enter image description here

运行代码时发生了什么:

enter image description here

如您所见,用户名部分有效,用户名已插入。但是,密码字段不是。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这很难看出问题中的格式。以下是该代码的副本 - 主观 - 更好的格式。在使用Webbrowser1执行某些操作之前,您可能会注意到end;。这是end;的结束if,因此它们是嵌套的。并且永远不会找到密码字段,因为它与两个条件都不匹配。

虽然代码格式化是一种品味问题,但有些事情确实有助于避免麻烦并使代码更具可读性。

原始重新格式化:

var
  Doc: IHTMLDocument2;
  I: Integer;
  Element: OleVariant;
  Elements: IHTMLElementCollection;
  Sub: Variant;
begin
  Doc := WebBrowser1.Document as IHTMLDocument2;
  Elements := Doc.All;
  for I := 0 to Elements.length - 1 do begin
    Element := Elements.item(I, varEmpty);

    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then
    begin
      if (Element.name = 'user') then Element.value := 'theusername';

      if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then
      begin
        if (Element.name = 'passwrd') then Element.value := 'thepassword';
      end;
    end;
    Sub := WebBrowser1.Document;
    Sub.frmLogin.Submit();
  end;
end;

解决了逻辑问题:

var
  Doc: IHTMLDocument2;
  I: Integer;
  Element: OleVariant;
  Elements: IHTMLElementCollection;
  Sub: Variant;
begin
  Doc := WebBrowser1.Document as IHTMLDocument2;
  Elements := Doc.All;
  for I := 0 to Elements.length - 1 do begin
    Element := Elements.item(I, varEmpty);

    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'TEXT') then
    begin
      if (Element.name = 'user') then
        Element.value := 'theusername';
    end;
    if (UpperCase(Element.tagName) = 'INPUT') and (UpperCase(Element.Type) = 'PASSWORD') then
    begin
      if (Element.name = 'passwrd') then
        Element.value := 'thepassword';
    end;
    Sub := WebBrowser1.Document;
    Sub.frmLogin.Submit();
  end;
end;