在德尔福搜索自动化?

Search automation in delphi?

提问人:John 提问时间:5/5/2019 更新时间:5/6/2019 访问量:795

问:

我正在尝试自动搜索。

我正在使用 google.com 进行搜索,搜索按钮名称是btnk。

我用谷歌搜索了一下,找到了下面的点击按钮代码:

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('btnK', thelink.Item(x).id) > 0 then
      begin  
        thelink.Item(x).click;  
        Break;
      end;
    end;
  end;
end; 

但是代码没有找到“btnK”或单击它。

现在,我正在手动输入搜索文本

Delphi Chromium 谷歌搜索 twebbrowser delphi-10.3-rio

评论

0赞 David Heffernan 5/5/2019
为什么要自动化 GUI 控制?你为什么不直接发布请求?
0赞 Ken White 5/5/2019
废话。如果浏览者可以检索它,您可以自己获取它。您只需要设置正确的User-Agent即可。
0赞 John 5/5/2019
@DavidHeffernan先生,您能给我举个例子 google.com 吗?
0赞 GolezTrol 5/6/2019
“但代码没有找到'btnK'或点击它。- 请更具体地描述症状。

答:

3赞 Tom Brunberg 5/6/2019 #1

Google 提供了各种 API 供程序员免费试用,并且长期和广泛使用的合理成本。以下内容可能违反谷歌使用条款,此处提供仅供学术讨论;)此外,这种解决方案通常是短暂的,因为它们容易受到所依赖内容的次要版本的影响。

这可能会变得棘手,因为似乎会根据哪个浏览器调用不同的页面进行响应。我没有安装,也无法检查它得到的响应,但(IE 11)得到了接近您期望的东西。www.google.comchromiumTWebBrowser

查看源(在 的 r-click 弹出菜单中,在 ...) 的 r-click 弹出菜单中)以验证元素类型和字段名称。View sourceTWebBrowserView page sourceChrome

以下是基于得到的响应,因为它回答了您的问题。TWebBrowser

您正在页面中搜索字段值为 的标签。但这样的事情并不存在!不在接收的页面中。https://www.google.comhtmlAidbtnKTWebBrowser

你显然在寻找这个:

<input value="Google Search" aria-label="Google Search" name="btnK" type="submit">

如您所见,它是一个标签,其值为inputnamebtnK

因此,修改代码,使第一行变为

  thelink:= WebBrowser1.OleObject.Document.all.tags('input');

第六行变为

    if Pos('btnK', thelink.Item(x).name) > 0 then

事实上,当您调用它时,它会激活搜索。click


但你可以做得更简单。在搜索字段中输入某些内容(例如“Delphi”)后查看 URL。对我来说,它看起来像下面:https://www.google.com

https://www.google.com/search?q=delphi&rlz=1C1Y...

该部分是有趣的部分(它可能不是紧跟在问号之后,而是在 URL 中)。'q=delphi'

因此,您可以简单地使用一个编辑框来输入要搜索的单词,并使用网络浏览器来显示结果

procedure TForm1.Button1Click(Sender: TObject);
const
  search = 'https://www.google.com/search?q=';
begin
  WebBrowser1.Navigate(search + Edit1.Text);
end;

评论

0赞 John 7/10/2019
谢谢你,先生。我试过了,但没有显示结果。这对我不起作用。不是 API 一个,而是您答案的另一个 OLE 版本
0赞 Tom Brunberg 7/12/2019
@John 您需要具体说明什么......不适合我。那么,你到底尝试了什么?