2

我正在尝试检索在 Firefox 选项卡中打开的所有 url。

这就是我到目前为止所做的,代码获取所有 Firefox url,是的,但它也从每个打开的文档中检索所有 url,例如来自论坛的嵌入式 youtube url,等等......我不是感兴趣的。

我该如何解决?

而且它也会引发异常

Microsoft.VisualBasic.dll 中出现了“System.InvalidOperationException”类型的第一次机会异常

尝试在此处转换为 String 时:

test.Add(TryCast(DirectCast(d.GetCurrentPattern(ValuePattern.Pattern), ValuePattern).Current.Value, String))

...但我想如果我可以正确“过滤”控件以检索正确的 url,那么这个问题应该可以解决。

此代码的另一个问题是,UI 自动化使我的 Firefox 进程无法从任务栏最小化,在运行这些 UI 自动化指令后,我无法按 Firefox 任务栏按钮来最大化/最小化窗口。

Imports System.Windows.Automation

Public Shared Function GetFirefoxUrls(process As Process) As List(Of String)

    If process Is Nothing Then
        Throw New ArgumentNullException("process")

    ElseIf process.MainWindowHandle = IntPtr.Zero Then
        Throw New ArgumentException("Invalid process.", "process")

    Else

        Dim element As AutomationElement =
            AutomationElement.FromHandle(process.MainWindowHandle)

        If element Is Nothing Then
            Return Nothing

        Else

            Dim docs As AutomationElementCollection =
                element.FindAll(TreeScope.Subtree,
                                New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Document))

            If docs Is Nothing Then
                Return Nothing

            Else

                Dim test As New List(Of String)

                For Each d In docs
                    Try
                        test.Add(TryCast(DirectCast(d.GetCurrentPattern(ValuePattern.Pattern), ValuePattern).Current.Value, String))

                    Catch ex As Exception
                        Debug.WriteLine(ex.Message)
                    End Try
                Next

                Return test

            End If ' doc Is Nothing

        End If ' element Is Nothing

    End If ' process Is Nothing

End Function

用法:

Dim urls As List(Of String) =
    GetFirefoxUrls(Process.GetProcessesByName("Firefox").First)
4

1 回答 1

2

使用 Inspect 工具(在 Windows 7 SDK 中),我看到所有 Firefox 选项卡的 URL EditControls 都有 Name="Search or enter address"。我不记得您可以根据元素的名称创建 PropertyCondition(我不相信您可以)。但是当您遍历 Document 元素时,您能否在将它们添加到列表之前获取每个元素的 Name 属性并与“搜索或输入地址”进行比较?--ie,就在这行代码之前:

test.Add(TryCast(DirectCast(d.GetCurrentPattern(ValuePattern.Pattern), ValuePattern).Current.Value, String))

[编辑] 哎呀,请忽略,说得太早了。Name="Search or enter address" EditControl 只是导航工具栏父级中的一个控件...它包含当前选项卡的 URL,而不是每个页面的 URL。

计划 B:您能否构建一个测试应用程序,它遍历整个文档并将 ValueProperty 值与 Firefox 测试会话中的已知 URL 文本片段片段(如“http://”之类的字符串)进行比较?然后查看这些元素与其他包含 URL 的元素有哪些共同属性——可能是一个共同的父名称等。

于 2014-08-04T22:55:15.103 回答