使用Visual Basic SSIS脚本任务与UIAutomation实现IE框架通知栏自动化
解决SSIS VB脚本任务中IE下载通知栏的自动化点击问题
我之前也碰到过类似的场景,用UIAutomation确实是比SendKeys靠谱太多的方案——毕竟SendKeys完全依赖窗口焦点,稍微有点干扰就失效了。下面给你详细的实现步骤和代码,还有一个更简洁的替代思路。
一、准备工作:添加UIAutomation引用
在SSIS的VB脚本任务编辑器中:
- 右键点击引用,选择添加引用
- 在弹出的对话框里找到并勾选
UIAutomationClient和UIAutomationTypes,点击确定完成引用添加
二、核心代码实现(UIAutomation方式)
这个思路是通过UIAutomation定位到IE窗口,再逐层找到黄色通知栏里的“保存”按钮,然后触发点击操作。以下是完整的VB脚本代码,可以直接放到你的脚本任务的Main方法中:
Imports System Imports System.Windows.Forms Imports System.Threading Imports UIAutomationClient Imports UIAutomationTypes Public Sub Main() ' 假设你已经完成了网站导航和点击"查看/下载"的操作,现在处理下载弹窗 Dim ieWindow As AutomationElement = Nothing Dim retryCount As Integer = 0 ' 等待IE下载通知栏出现,最多重试10次(可根据实际情况调整) Do While ieWindow Is Nothing AndAlso retryCount < 10 ' 定位IE主窗口,这里用窗口标题关键词匹配,你可以根据实际窗口标题调整 ieWindow = AutomationElement.RootElement.FindFirst( TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, "FINCEN MSB Registrant Search - Internet Explorer", PropertyConditionFlags.IgnoreCase) ) Thread.Sleep(1000) retryCount += 1 Loop If ieWindow IsNot Nothing Then ' 定位黄色下载通知栏(ControlType为ToolBar) Dim notificationBar As AutomationElement = ieWindow.FindFirst( TreeScope.Descendants, New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar) ) If notificationBar IsNot Nothing Then ' 定位"保存"按钮,通过Name属性匹配 Dim saveButton As AutomationElement = notificationBar.FindFirst( TreeScope.Children, New AndCondition( New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), New PropertyCondition(AutomationElement.NameProperty, "保存", PropertyConditionFlags.IgnoreCase) ) ) If saveButton IsNot Nothing Then ' 获取按钮的InvokePattern,执行点击操作 Dim invokePattern As InvokePattern = DirectCast(saveButton.GetCurrentPattern(InvokePattern.Pattern), InvokePattern) invokePattern.Invoke() Dts.TaskResult = ScriptResults.Success Else MessageBox.Show("未找到保存按钮") Dts.TaskResult = ScriptResults.Failure End If Else MessageBox.Show("未找到下载通知栏") Dts.TaskResult = ScriptResults.Failure End If Else MessageBox.Show("未找到IE窗口") Dts.TaskResult = ScriptResults.Failure End If End Sub
代码说明:
- 首先通过窗口标题定位IE主窗口,你需要根据实际的IE窗口标题调整
NameProperty的匹配值 - 循环等待窗口出现,避免因为页面加载延迟导致定位失败
- 逐层定位到通知栏和保存按钮,使用
InvokePattern触发点击,这是UIAutomation标准的控件交互方式,比模拟按键稳定得多
三、更简洁的替代方案:直接下载文件
如果能绕过浏览器模拟,直接获取Excel文件的真实下载URL,那效率和稳定性会更高。你可以按以下步骤操作:
- 打开浏览器的开发者工具(F12),切换到网络标签
- 手动点击网站上的“查看/下载”链接,观察网络请求,找到下载Excel的那个请求
- 复制该请求的URL(注意如果有动态参数,需要分析参数的生成逻辑)
- 在VB脚本任务中使用
WebClient或HttpClient直接下载文件,示例代码如下:
Imports System Imports System.Net Public Sub Main() Dim downloadUrl As String = "这里替换为你找到的真实Excel下载URL" Dim savePath As String = "C:\Your\Save\Path\MSB_Registrants.xlsx" ' 替换为你的保存路径 Using client As New WebClient() ' 如果网站需要Cookie验证,这里可以添加之前浏览器登录后的Cookie ' client.Headers.Add(HttpRequestHeader.Cookie, "你的Cookie内容") client.DownloadFile(downloadUrl, savePath) End Using Dts.TaskResult = ScriptResults.Success End Sub
这个方案的优势是不需要依赖浏览器和UI自动化,完全是后台请求,稳定性和效率都更高。唯一需要注意的是如果网站有反爬机制或者需要会话验证,可能需要处理Cookie或请求头的问题。
内容的提问来源于stack exchange,提问作者Adib Akale
相关产品推荐
相关产品推荐

