Ex1: WebBrowser.OleObject.Document.GetElementByID('ID HERE').Click;
上面两个例子是通过 Delphi 在网页上按下按钮的。Ex2 在各种网站上运行良好,但不是全部。这是因为 Ex2 仅适用于 HTML 按钮吗?我尝试了 Ex1,但缺少一些代码,当我尝试时,我收到一条消息,提示“需要对象或类类型”。Ex1 也没有示例代码,任何人都可以告诉我为什么我会收到此消息并为 Ex1 提供一些代码。
Ex1: WebBrowser.OleObject.Document.GetElementByID('ID HERE').Click;
上面两个例子是通过 Delphi 在网页上按下按钮的。Ex2 在各种网站上运行良好,但不是全部。这是因为 Ex2 仅适用于 HTML 按钮吗?我尝试了 Ex1,但缺少一些代码,当我尝试时,我收到一条消息,提示“需要对象或类类型”。Ex1 也没有示例代码,任何人都可以告诉我为什么我会收到此消息并为 Ex1 提供一些代码。
我从 delphipages 的MrBaseball34得到这个代码 它最初没有用,因为我写的是 'WebBrowser' 而不是 'WebBrowser1'。但它完美地工作。这是代码:
procedure TForm1.Button1Click(Sender: TObject);
var
x: integer;
thelink: OleVariant;
begin
thelink:= WebBrowser1.OleObject.Document.all.tags('A');
if thelink.Length > 0 then
begin
for x := 0 to thelink.Length-1 do
begin
if Pos('put id string here', thelink.Item(x).id) > 0 then
begin
thelink.Item(x).click;
Break;
end;
end;
end;
end;
通常在使用 TWebBrowser 和 COM/ActiveX 对象时,了解后期绑定和早期绑定之间的区别非常方便。如果您使用 OleVariant 变量,让它们引用“活动”对象,并使用点运算符 ( .
) 来调用方法和属性,它们会在运行时得到解析。它们是后期绑定的,而不是您将使用特定接口的早期绑定。
在uses子句中包含unit MSHTML
,然后use IHTMLDocument3(WebBrowser1.Document)
,和定义的不同接口MSHTML
,如IHTMLElement
and IHTMLAnchorElement
。您会发现在某种程度上您还可以完成代码,但您可能需要在操作符之类的IHTMLElement
操作之间进行额外的转换。IHTMLElement2
as
可能有任何类型的错误。就像拼写错误的 ID 或错误的数据类型缺少您希望使用的接口,或者缺少某些项目并返回nil
。
像长线这样的问题WebBrowser.OleObject.Document.GetElementByID('ID HERE').Click;
是你很难知道错误发生在哪个地方。有时检查中间值及其属性并不容易。这么长的一行代码中有很多与生俱来的期望,你很难发现哪一个失败了。
当您遇到如此长的行中的错误时,您最好将它们拆分为微小的操作项——古老的分而治之原则。声明几个变量并将这条长而复杂的线分成多个简单的线。
var0 := WebBrowser;
var1 := var0.OleObject;
var2 := var1.Document;
var3 := var2.GetElementByID('ID HERE');
var3.Click;
跟踪这一点,一次执行一行,您可以检查在每个遍历步骤中将发出哪些值和数据类型。