自动化 Web 浏览






4.81/5 (36投票s)
2006年12月11日
4分钟阅读

247518

9127
一篇关于如何自动化网页浏览的文章:点击按钮、在文本框中输入数据等。
引言
在本文中,我想介绍一种自动化我们使用鼠标和键盘在网页浏览器中执行的任务的可能性。这可能意味着:打开一个页面、在文本框中输入数据、按一个按钮等。这些基础可以扩展成更复杂的操作,例如搜索、分析网页数据、在域内自动爬行,或者如果您想构建自己的测试工具来测试 Web 应用程序,所有这些都可以使用。
通常,处理网页数据的方法是这样的
WebRequest req = WebRequest.Create("www.codeproject.com");
WebResponse res = req.GetResponse( );
通过解析响应的 HTML,可以检查页面的原始 HTML 内容,找出按钮、隐藏字段等。然后可以进行进一步的 POST 请求,从而模仿链接点击或按钮点击。但在这里我们介绍一种不同的方法。我们将使用 .NET 2.0 框架中的 WebBrowser
类。这将使其与使用请求-响应模型不同。在使用请求-响应组合时,我们处理的是文本文件。使用 WebBrowser
控件,我们将访问页面及其元素,级别更高;例如,链接和按钮将成为“对象”。所以我们会说类似的话
Button btn = browser.ReturnElementByName(“myButton”);
btn.Click();
背景
WebBrowser
ActiveX 控件是您本地 Internet Explorer 浏览器的实例,具有其所有功能和问题。与此控件的所有通信都通过 MSHTML 库完成。该库拥有网页所有控件的接口,这些接口适用于所有 Windows 版本。基本上,您总是会得到一个对象,并将其转换为您需要的接口。如果您不知道正确的接口是什么,那将很困难。目前,还没有完整的包装器。但是,您可以在调试 WebBrowser
的元素集合时,在特定元素的 DomElement
属性中看到正确的接口。
您可以在 此处 阅读有关类似组件的精彩描述。该文章引用了早期版本的 .NET 框架。
使用代码
那么,让我们看看如何在浏览器中打开一个新页面。这非常简单public string OpenPage(WebBrowser browser, string urlToLoad)
{
browser.Navigate(urlToLoad);
}
这里有一个重要的事情需要提及:将页面加载到浏览器是一个异步操作。我们永远不知道页面何时会加载。因此,如果我们想加载一个页面并点击该页面上的一个按钮,我们的加载场景必须等待,直到页面加载完成。我们可以通过以下方式实现这一点
public string OpenPage(WebBrowser browser, string urlToLoad){
bool loadFinished = false;
browser.DocumentCompleted += delegate { loadFinished = true; };
browser.Navigate(urlToLoad);
while (!loadFinished && counterTimeOut > 0){
Thread.Sleep(100);
Application.DoEvents();
}
}
所以我们在这里做了什么:我们订阅了页面在我们浏览器中完全加载时发生的事件。这将把标志设置为 true
,并且我们的 while
循环将结束。在 while
循环中,我们只是在等待,同时让应用程序处理事件。
点击按钮,我们首先将页面加载到浏览器中。然后我们从 WebBrowser.HtmlElementCollection
中按名称获取一个按钮。然后我们将按钮转换为 MSHTML 接口对象 HTMLInputElementClass
。然后我们可以如下点击按钮
HTMLInputElementClass iElement = (HTMLInputElementClass) button.DomElement;
iElement.click();
点击链接,我们必须将 HTMLElement
转换为不同的 MSHTML 对象,如下所示
HTMLAnchorElementClass linkElement =
(HTMLAnchorElementClass) linkToClick.DomElement;
linkElement.click();
在输入字段中输入数据,我们甚至不需要类型转换。我们只需从 WebBrowser
中获取输入框作为 HtmlElement
,然后简单地说
element.InnerText = valueToFill;
选择单选按钮,我们使用以下代码
HTMLInputElementClass iElement =
(HTMLInputElementClass)radioToSelect.DomElement;
iElement.@checked = true;
从组合框中选择一个值,我们使用
HTMLSelectElementClass iElement =
(HTMLSelectElementClass) dropdown.DomElement;
iElement.value = value;
将页面另存为图片(快照)在许多场景下也可能很有用。Web 浏览器允许我们将当前页面保存为快照。我们可以通过此示例函数实现这一点
Rectangle rec = new Rectangle();
rec.Offset(0, 0);
rec.Size = browser.Document.Window.Size;
Bitmap bmp = new Bitmap(rec.Width, rec.Height);
browser.DrawToBitmap(bmp, rec);
bmp.Save(“file.path”, ImageFormat.Jpeg);
在下载中,您将获得所有这些步骤的源代码,还有一个非常简单的 Windows 应用程序,演示了如何使用这些示例。请注意,为了使代码示例尽可能简单,示例中不包含任何面向对象的原则,如继承。运行演示需要安装 .NET Framework 2.0。
关注点
通过这些简单的步骤,可以非常快速地编写出满足特定用途的复杂工具。例如,我们开发了一个由 XML 文件控制的完整测试工具,您只需以这种方式在 XML 中编写测试用例:转到页面、点击链接、输入数据、点击按钮、保存页面图片供以后查看等。
然而,我们还没有解决的问题是
- 框架环境(旧的 ASP 网站通常使用框架构建),
- 录制机(这样一个人就可以浏览一个页面,他所做的事情的历史将被保存在一个简单的任务集合中)。
在使用此示例时,请不要忘记使用广为人知的 Firefox 开发者附加组件:Web developer toolbar。 它非常有帮助。