1

我正在做一些自动化工作,可以绕过网站并发布到 HTML 表单,但现在我面临一个新的挑战,Ajax表单。

由于没有可阅读的资源,我想知道是否可以在 C# 中以编程方式填写 Ajax 表单。我目前正在使用不可见的 axWebBrowser。

在此先感谢您的帮助!

4

2 回答 2

6

是的,但我建议使用不同的方法来请求/响应服务器页面,包括常规页面和 AJAX 处理程序页面。

在 c# 中,尝试使用WebRequest / WebResponse或更专业的 HttpWebRequest/HttpWebResponse 类。

Ajax 只不过是一种允许 Javascript 向服务器发出 HTTP 请求的技术的“花哨”名称,该服务器通常实现一些处理程序,为 Javascript 调用者生成专门的、轻量级的内容(通常编码为 JSON)。

因此,为了模拟 AJAX 调用,您所要做的就是检查您的目标应用程序(您想要“发布”到的网页)并查看用于 AJAX 通信的格式 - 然后从 C# 复制页面的 Javascript 行为使用 WebREquest/WebResponse 类。

请参阅Firebug - 一个很棒的工具,它允许您检查网页以确定它发出什么调用、对哪些页面以及这些页面响应什么。它在检查 AJAX 调用方面也做得很好。

这是一个非常简单的示例,说明如何执行 Web 请求:

HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create("http://www.mysite.com");

using (HttpWebResponse resp = (HttpWebResponse)wReq.GetResponse())
{
   // NOTE: A better approach would be to use the encoding returned by the server in
   // the Response headers (I'm using UTF 8 for brevity)
   using (StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
   {
       string content = sr.ReadToEnd();
       // Do something with the content
   }
}    

POST 也是一个请求,但使用不同的方法。有关如何做一个非常简单的帖子的示例,请参阅此页面。

编辑- 有关使用 Firebug 检查页面行为的详细信息

我通过检查您尝试复制的页面的意思是使用一种工具(我在 Firefox 上使用 Firebug)来确定页面和服务器之间的信息流。

使用 Firebug,您可以使用“Net”和“Console”面板来完成此操作。Net 面板列出了加载页面时浏览器执行的所有请求。而“控制台”将列出页面加载后页面与服务器之间发生的通信。在页面加载后发生的那些通信本质上是您想要复制的 AJAX 调用(注意:必须在 Firebug 中启用网络监控才能使其工作)

查看Michael Sync 的教程以了解有关 Firebug 的更多信息,并使用控制台面板进行试验以了解有关 AJAX 请求的更多信息。

关于“使用 WebRequest/WebResponse 从 C# 复制页面的行为”——您必须意识到,就像我之前所说的,Javascript AJAX 调用只不过是一个 HTTP 请求。这是 Javacript 在“幕后”或带外向 Web 服务器发出的 HTTP 请求。要复制这一点,它实际上与复制一个普通的 GET 或一个普通的 POST 就像我上面展示的一样。这就是 Firebug 发挥作用的地方。使用它,您可以查看请求,因为 Javascript 使请求 - 查看控制台面板,并查看请求消息的样子。

然后您可以使用与上述相同的技术,使用 HttpWebRequest/HttpWebResponse 发出与 Javascript 相同类型的请求,而只能从 C# 中进行。

Gregg,我希望这能澄清我的答案,但除此之外,我建议使用 Firebug,并可能了解更多关于 HTTP 协议如何工作以及 AJAX 作为一项技术如何工作的信息。

于 2009-04-29T18:14:47.050 回答
1

你有没有看过使用 Selenium。AFAIK,您可以用 C# 编写测试用例,我知道我们的测试人员之前已经成功使用它来测试启用 Ajax 的 ASP.NET 站点的 UI 测试

http://seleniumhq.org/

于 2009-04-29T18:09:38.217 回答