【问题标题】:Accessing the DOM of a Chrome Tab from Visual Studio从 Visual Studio 访问 Chrome 选项卡的 DOM
【发布时间】:2017-05-18 08:58:23
【问题描述】:

我经常写c#VB.net 来访问和修改Internet Explorer 页面的DOM 使用以下内容:

SHDocVw.InternetExplorer IE = shell.Windows().Item(i);
mshtml.HTMLDocument doc = IE.Document;
mshtml.IHTMLElement o = doc.getElementById(sID);

如何访问在Chrome 中打开的网页的DOM?我想我已经用尽了 google 和 stackoverflow 并没有真正找到任何东西。任何帮助将不胜感激。

【问题讨论】:

  • 嗨,梅德里克。感谢您提供链接,但他们从不访问 Chrome 文档,只需从 Chrome 窗口中提取 URL。
  • 你为什么认为 chrome 会允许你访问 DOM

标签: c# vb.net visual-studio google-chrome dom


【解决方案1】:

我只是为了类似的目的而试图弄清楚这一点。故事的寓意是您要么需要使用“本地消息传递”(Chrome 基本上将其称为已部署的 .EXE),要么创建一个使用 JavaScript 与您的应用程序对话的扩展。

https://developer.chrome.com/extensions https://developer.chrome.com/extensions/nativeMessaging

这与 IE 不同,您可以简单地将底层 DOM 分配给一个对象。 Chrome 不会以同样的方式公开 API 或底层 DOM。

我解决这个问题的方法是使用 C# 中的 WebSocket 服务器(SuperWebSocketin NuGet)和 Chrome 扩展中的 Javascript 来调用所述 WebSocket 服务器。对于 Chrome 扩展程序,JavaScript 在后台运行,因此您可以连接并建立会话来来回传递消息。

以下是如何启动 WebSocket 客户端的示例: https://github.com/kerryjiang/SuperWebSocket/blob/master/Samples/BasicConsole/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SuperSocket.SocketBase;

namespace SuperWebSocket.Samples.BasicConsole
{
class Program
{
    static void Main(string[] args)
    {
         Console.WriteLine("Press any key to start the WebSocketServer!");

        Console.ReadKey();
        Console.WriteLine();

        var appServer = new WebSocketServer();

        //Setup the appServer
        if (!appServer.Setup(2012)) //Setup with listening port
        {
            Console.WriteLine("Failed to setup!");
            Console.ReadKey();
            return;
        }

        appServer.NewMessageReceived += new SessionHandler<WebSocketSession, string>(appServer_NewMessageReceived);

        Console.WriteLine();

        //Try to start the appServer
        if (!appServer.Start())
        {
            Console.WriteLine("Failed to start!");
            Console.ReadKey();
            return;
        }

        Console.WriteLine("The server started successfully, press key 'q' to stop it!");

        while (Console.ReadKey().KeyChar != 'q')
        {
            Console.WriteLine();
            continue;
        }

        //Stop the appServer
        appServer.Stop();

        Console.WriteLine();
        Console.WriteLine("The server was stopped!");
        Console.ReadKey();
    }

    static void appServer_NewMessageReceived(WebSocketSession session, string message)
    {
        //Send the received message back
        session.Send("Server: " + message);
    }
}
}

这是尝试新 WebSocket 连接的示例 JavaScript:

function attemptConnection() {


if (!connectionMade) {
    var exampleSocket = new WebSocket("ws://localhost:8080");

    exampleSocket.onopen = function () {
        connectionMade = true;
    };

    exampleSocket.onmessage = function (event) {
    //msg received from C#          
    }

    exampleSocket.onerror = function () {
        //do nothing
    }

    exampleSocket.onclose = function () {
        connectionMade = false;
    }


}



}

您可以使用任何您想要的 WebSocket 服务器库。它的要点是 Chrome 扩展程序打开与您的应用程序的通信线路,然后这两个来回传递消息,Chrome 扩展程序或应用程序可以对其进行操作。例如,C# 可以传递包含您要在网页上更新的字段元素的 Chrome 扩展 JSON。

另外,请记住,您必须将 Chrome 扩展程序部署到 Chrome 网上应用店(并在需要时设置为私有),否则它将自动禁用。

【讨论】:

  • 谢谢,我下周试试!
【解决方案2】:

您可以使用 Javascript 来访问它。


Chrome Extension - Get DOM content
我敢打赌,不能用 .NET 做到这一点。根据文档,Chrome 不提供 .NET API。 (除非我错过了什么)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2011-12-16
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多