【问题标题】:Delphi: Webbrowser.Document -> check existence of Element by IDDelphi:Webbrowser.Document -> 通过 ID 检查元素是否存在
【发布时间】:2017-11-05 21:18:14
【问题描述】:

我有一个 TWebbrowser 组件和一些按钮在做一些事情。到目前为止效果很好,但是在一个过程中,我想单击网站上的一个按钮以显示其他信息,这些信息也应该被单击。

所以我有这个:

WebBrowser1.OleObject.Document.GetElementByID('linkDtlC0-0').Click();
WebBrowser1.OleObject.Document.GetElementByID('linkDtlC0-1').Click();
WebBrowser1.OleObject.Document.GetElementByID('linkDtlC0-2').Click();

然后我必须单击网站上的按钮以显示接下来要单击的三个元素。到目前为止没问题,但是在单击按钮后,网站需要几秒钟才能显示这三个元素。

我的问题: 当我尝试在清楚地单击 Button 后立即单击元素时,会导致错误提示没有(尚未)使用此名称单击的元素。当然我可以让我的程序等待几秒钟(更多)只是确定然后尝试点击,但我不想浪费时间所以我的问题是: 有没有办法检查 TWebbrowser 内的 Document 上是否存在元素(按名称)?

【问题讨论】:

  • 处理OnDocumentComplete 事件并在那里检查pDisp = TWebBrowser(Sender).ControlInterface(这意味着文档“准备好”)。如果是这样,请开始遍历您的文档。要检查某个元素是否存在,您只需检查GetElementByID 返回的引用是否为Assigned
  • 这也不起作用。也许你的答案是对的,但我遇到了 TWebbrowser 的一些可疑行为:我手动单击按钮并等待几秒钟,直到出现所需的元素。然后我使用WebBrowser1.OleObject.Document.All.Item(i).ID); 列出了所有 ID,前三个元素正常显示,但下一个(第四个)项目仍然没有列出,尽管我的常规浏览器(chrome 和 firefox)告诉我,第四个元素应该在那里。我的 TWebbrowser 似乎出于某种未知原因忽略了网站上的更改。
  • 该网站有时会使用第一个数字“0”三次,但有时在增加第一个数字之前也会使用四到五次。这对我来说并不那么明显,因为当我用一些随机数据它总是在计数,因为我认为它每次都会这样做,但事实并非如此。很抱歉问这个问题,但我认为这是 TWebbrowser 组件的问题。 ——
  • 我回滚了您的编辑。在这里编辑您的帖子并添加[已解决]和解决方案是不合适的。如果您愿意,您可以回答您自己的问题,但您必须正确回答,方法是在下面提供的空白处以答案的形式回答。请参阅Can I answer my own questions here? 了解更多信息。
  • 您已经知道问题的答案 - getElementById。它会告诉你给定的命名元素是否存在。这不是你真正的问题。您真正的问题是如何检测新对象何时可用。为此,我将启动一个短计时器(不是循环,除非您在其中调用Application.ProcessMessages,这是不可取的)并调用getElementById,直到它返回一个有效对象,然后继续。不要过早致电Click!使用异常处理程序来检测存在是错误的方法。

标签: delphi element twebbrowser


【解决方案1】:

检查一个元素是否存在:

uses
  MSHTML;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
var
  Element: IHTMLElement;
begin
  if pDisp = TWebBrowser(ASender).ControlInterface then
  begin
    Element := (WebBrowser1.Document as IHTMLDocument3).getElementById('linkDtlC0-3');
    if Assigned(Element) then
      Element.click;
  end;
end;

【讨论】:

  • 没有。这不是你应该做的。它可以像this 一样简单。
猜你喜欢
  • 2014-09-11
  • 2015-04-25
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
相关资源
最近更新 更多