代码改变世界

PowerShell2.0之与COM对象交互(四)IE自动化

2010-12-24 01:32 @天行健中国元素 阅读(...) 评论(...) 编辑 收藏

上一篇文章主要介绍了powershell中通过COM操作Excel,本篇文章中将会着重介绍powershell中通过COM操作IE达到自动化管理的目的。

Internet Explorer浏览器提供基于COM的富对象模型,可以用来编写网站的自动化测试脚本模仿用户操作,如输入文字和单击按钮等并用浏览器创建提交信息的脚本。

能够编程控制Internet Explorer的仍然是application对象,其ProgID是InternetExplorer.Application。完成自动化范例脚本需要的操作步骤如下。

(1)创建Internet Explorer Application对象。

(2)浏览一个URL。

(3)等待浏览器载入文档内容。

(4)操作文档。

(5)通过调用Quit()方法退出Application。

如果Internet Explorer在后台浏览并下载网页内容,则意味着脚本将不会被阻塞,当尝试操作未曾下载完毕的文档时将会崩溃。可以使用sleep cmdlet来阻塞脚本的执行并周期性地检查application的Busy属性是否为$false来确定下载是否完成,下载完成后访问和修改网页文件才是安全的。

(1)用脚本控制浏览器进程

下面使用Internet Explorer自动化对象打开浏览器窗口并通过Google搜索引擎搜索内容。这里创建一个名为“Search-GoogleCom.ps1”的脚本,其中将实例化Internet Explorer、浏览搜索引擎、输入搜索关键字并单击按钮。然后显示浏览器窗口检查搜索结果,并继续浏览选择的条目。该脚本的代码如下:

function WaitForLoad ($ie)

{

while ($ie.Busy)

{

sleep -milliseconds 50

}

}

$ie = New-Object -COM InternetExplorer.Application

$ie.Navigate("http://www.google.com")

$ie.Visible = $true

WaitForLoad($ie)

$searchBox = $ie.Document.getElementById("q")

$searchBox.value = "`"Windows PowerShell`""

$goButton = $ie.Document.getElementByID("btnG")

$goButton.click();

其中的WaitForLoad函数每隔50毫秒检查浏览器是否处于繁忙状态,如果繁忙,则继续等待50毫秒,期间需要调用sleep来释放由循环占用的CPU的资源。而对于用户来说,50毫秒的停顿在等待页面加载完成时的感觉并不明显。

加载页面完成后需要开始操作文档中的对象,获取HTML文档对象通过Document属性,它支持所有Web开发人员熟悉的方法和属性。使用getElementById()方法获取文本框的引用,其中保存搜索关键字。搜索按钮的ID是“btnG”,通过设置文本框的Value属性可以将关键字输入到文本框中。在脚本中设置的搜索关键字是“"Windows PowerShell"”,它由引号引起,这样可以把其中的空格也作为搜索内容来匹配整个词汇。在执行上述操作后调用了按钮的click()方法,提交表单数据。默认情况下Internet Explorer窗口不可见,通过设置Visible属性为$true使窗口可见。图2-17所示为该脚本的执行结果。

image

图1 执行结果

如果需要在不显示浏览器窗口的情况下提取远程主机中的页面信息,则使用HTML文档对象模型(DOM)编程接口。这是一组由W3C组织定义的标准接口,能够在任何浏览器中使用JavaScript代码操作。有Web编程经验的读者会注意到前面有使用getElementById()方法通过Internet Explorer的COM接口调用任何DOM元素的实例。

【提示】

DOM编程接口由W3C组织和微软共同发布,其中W3C主要关注在所有浏览器上如何运行,而事实上没有浏览器是完全按照标准实施的。微软主要将W3C的标准落实到Internet Explorer的具体的解析方法上,其DOM解析文档网址是http://msdn.microsoft.com/en-us/library/
ms533050.aspx。

为了演示操作HTML DOM对象,创建一个名为“Get-WebSearchResults.ps1”的脚本。它以静默方式访问Google.com,提交查询并将返回的查询结果中包含的链接页面打印到控制台上。这个脚本主要依靠Google.com生成的ID为“res”的<div>HTML元素,并从中提取出网页链接。而链接是<a>元素包含href属性,其中包含的URL为所需。该脚本的代码如下:

function WaitForLoad ($ie)

{

while ($ie.Busy)

{

sleep -milliseconds 50

}

}

$ie = New-Object -COM InternetExplorer.Application

$ie.Navigate("http://www.google.com")

$ie.Visible = $true

WaitForLoad($ie)

$searchBox = $ie.Document.getElementById("q")

$searchBox.value = "`"Windows PowerShell`""

$goButton = $ie.Document.getElementByID("btnG")

$goButton.click();

WaitForLoad($ie)

$resultsDiv = $ie.Document.getElementById("res")

$links = [object[]] $resultsDiv.getElementsByTagName("a")

$realLinks = $links | where { $_.innerText -ne "Cached page" }

$realLinks | select innerText,href | Format-List

$ie.Quit()

GetElementByTagName()方法返回所有指定标签的子元素,用户可以用来获取页面中包含的所有“res”元素。在其中过滤链接中包含“Cached page”的缓存页面,因为这些链接仅包含Google缓存服务器中的各版本的缓存,由于没有大的实际意义,所以这里将此类内容丢弃。在确认收集的链接中包含的innerText和href属性并将其通过Format-List cmdlet格式化,图18所示为该脚本的执行时结果。

image

图2 执行结果

PowerShell为COM对象提供了近乎完美的支持,本文的实例涉及主要的交互性操作,如使用集合和索引属性。只要不同的应用程序和服务已经具有公开的COM自动化接口,则可尝试使用COM来提高工作效率。本文介绍了针对Internet Explorer浏览器的自动化编程,用户可以通过以上的介绍扩展到对其他COM对象进行操作。

 

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/