【问题标题】:How to fill a web form inputs using delphi XE3?如何使用 delphi XE3 填写 Web 表单输入?
【发布时间】:2013-04-26 07:55:13
【问题描述】:

我需要知道如何使用 Delphi XE3 填写 Web 表单?我有一个带有用户名和密码的网络表单,那么如何以编程方式填写呢?

页面是http://batelco.com/portal 看到只有两个输入用户名和传递,那么如何填写和传递它们?

【问题讨论】:

  • 也许您不需要填写,只需发布​​即可?如果表单不包含验证码或类似的一次性保护,您甚至可以在不加载表单的情况下提交结果。
  • 如果您只需要在后台发出简单的 POST 或 GET HTTP 请求,则绝对不应该使用 TWebBrowser 控件并以编程方式填写表单。
  • @AndreasRejbrand 似乎他启动了用户登录序列。鉴于 WWW 页面很少使用标准 HTTP 身份验证,该页面可能会使用 UTL 或 cookie 或隐藏表单或天知道是什么做一些奇怪的事情。在这种情况下,发布登录名/密码并不难,但了解如何进行身份验证以及如何将其传送到后面的页面将是一个单独且相当复杂的问题。因此,可能需要将页面加载到 MSIE 或其他引擎中,但仍然如此。
  • 我尝试使用的网页没有任何验证码,这是我的 ISP 网页,一个基本的用户名和密码,用于登录我的帐户并检查我使用了多少下载量,所以我正在尝试制作和应用程序自动记录并显示使用的下载,就是这样
  • 您能否在问题中包含登录表单的 HTML 代码?解决方案取决于身份验证方法,因此这将非常有帮助。

标签: html forms delphi delphi-xe3 twebbrowser


【解决方案1】:

使用 Internet Direct (Indy) HTTP 客户端类,您可以使用 HTTP POST 向服务器提交表单值。

如果已将 TIdCookieManager 类的实例分配给 IdHTTP 客户端组件,Indy HTTP 客户端还将接收和存储服务器随其响应发送的 cookie。

当客户端向服务器上的其他安全 URL 发出进一步的 HTTP 请求时,许多安全 Web 应用程序都需要 HTTP cookie。然后,Indy HTTP 客户端将随请求一起发送 cookie(如果已将 TIdCookieManager 分配给 IdHTTP 客户端组件)。

因此,您可以在登录 URL 上发送登录 POST 请求,提供所需的身份验证信息,然后向下载统计信息 URL 发送 GET 请求以检索其 HTML。


关于您使用 ASP 的特定登录表单,这里有一个关于以编程方式发送 POST 请求的问题:HowTo deal with cryptic hidden values for ASP Net (__VIEWSTATE)

【讨论】:

  • 这个人甚至无法理解哪个页面是实际的登录表单,您建议他跨域cookie处理和复合跨域页面手动解析。虽然这应该是最有效的方法,但我认为他做不到。
  • @Arioch'我没有提到或建议在任何地方处理“跨域 cookie”
  • 你没有,但是该页面使用来自不同域的登录表单,登录期间设置的cookie很可能必须在原始域上使用
  • @Arioch'用于会话识别(这是服务器端登录表单所需要的),跨域 cookie 是我可能期望的最少 - 服务器将如何交换会话 ID cookie 并将其与用户相关联?所以我认为登录表单和经过身份验证(安全)的资源位于同一个域中的同一台服务器上。
  • 希望您是正确的。如果所有额外服务都是通过 FRAME/IFRAME 进行的。但是我记得像 borland.com/borland.ru 或今天的 google.com/google.ru 之类的域
【解决方案2】:

本文展示了如何获取和设置命名元素的属性。

您应该获取并设置value 属性。表单元素的 ID 取决于您的页面。

Check if Element with ID has a value


这篇文章虽然被问到“如何阅读”,但也描述了如何获取值以及如何设置它们。毕竟如果你可以做到A := B(读取值),那么你可能也可以做到B := A(设置值)。

read content in webbrowser input field


现在,问题中给出了页面 URL,我们可以用右键单击 WWW 浏览器右上角的登录表单元素,然后选择“检查元素”以查看其来源。或者,如果浏览器不是现代的并且菜单上没有 Inspect 命令,我们可以使用另一个命令,例如 View page source 并在整个页面的源中查找表单。例如,这些元素之一是

<input name="txtUsername" type="text" maxlength="15"
 id="txtUsername" tabindex="1" class="inpu-field" onfocus="txtfocus();"
 onblur="txtblur();" style="color: gray; background-image: none;">

因此我们知道表单的第一个元素的 ID,我们需要获取(读取)或设置(写入)其“值”属性。 上面的链接显示了如何做到这一点,给定已知的 ID。

顺便说一句,你的页面错了,真实页面https://www.e-services.com.bh/Eservices/login_batelco.aspx

你的原始页面呢,它只是不适用于默认模式下的 TWebBrowser MSIE6 - 与所有使用 Microsoft ActiveX 组件的编写应用程序兼容。见http://imgur.com/ad4wbOI

如果可以使用 Google Chrome 代替 TWebBrowser。 或者您可以将 ActiveX 接口作为 TWebBrowser 属性之一,获取新接口并关闭 MSIE6 兼容性http://msdn.microsoft.com/en-us/library/aa752510.aspx

但是,“如何使此页面在 twebbrowser 中呈现”是另一个新问题,而不是您在此处提出的问题。


实际上,我不投票赞成将这个问题作为重复问题结束的唯一原因是因为上述文章的标题中都没有“设置”或“写入”或“填充”,所以找到它们是比琐碎更难。


但是,如果页面在加载时没有发生变化,并且没有像 CAPTCHA 或唯一表单哈希码这样的一次性保护,那么您可以通过单个 HTTP 请求发布所有值,甚至无需加载表单。

【讨论】:

  • 告诉我怎么做??顺便说一句,twebbrowser 中无法显示部分用户名和密码!怎么读!
  • 如果它们“无法显示”,那就是另一个问题了。如果您的用户看不到在哪里单击并输入文本 - 那么您就没有什么可阅读的了。提出一个单独的问题,如何在 Delphi+MSIE 中加载该页面。或者你可以使用 Delphi+Chrome 或 Delphi+THTMLViewer
  • 如果我使用 Internet Explorer 就没有问题,但我使用 Delphi 的 twebbrowser 就没有问题!!这就是问题发生的地方!
  • 那么这是另一个问题,不是用户输入后如何读取值,而是如何在 TWebBrowser 中呈现此页面以便用户执行。那是不同的问题。也尝试在 MSIE6 中检查该页面,我稍微记得默认情况下 TWebBrowser 在 MSIE6 模式下工作,而不是在现代模式下,为了兼容性。如果您的站点与 MSIE6 不兼容,那么这可能就是问题所在。也许是msdn.microsoft.com/en-us/library/aa752510.aspx
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多