获取计算机上已安装浏览器的列表

7
我想知道是否有可能使用C#获取计算机上安装的浏览器列表? 我在我的任务中使用Selenium WebDriver,需要知道哪些浏览器已安装,因为在Selenium中我只能运行特定的浏览器,例如对于Firefox,它将是:
IWebDriver driver = new FirefoxDriver();

我会感激任何帮助。


2
你在谈论哪个平台?Windows?其他的?没有任何东西表明“嗨,我是一个网页浏览器”。你需要有一个定义好的列表,然后只搜索那些安装。 - rory.ap
@rory.ap 只支持 Windows。 - Zirochka
找到已安装的浏览器的一种方法是通过查看注册表中注册的已安装应用程序,这也是“添加和删除程序/程序和功能”中所见列表的来源。 - Martin Costello
4个回答

11

你还需要考虑机器架构(x64 vs x86)以及Microsoft Edge不在指定键下的事实。以下是我最终使用的内容(基于在网上找到的多个解决方案):

private List<Browser> GetBrowsers()
    {
        RegistryKey browserKeys;
        browserKeys = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Clients\StartMenuInternet");
        if (browserKeys == null)
            browserKeys = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet");
        string[] browserNames = browserKeys.GetSubKeyNames();
        List<Browser> browsers = new List<Browser>();
        for (int i = 0; i < browserNames.Length; i++)
        {
            Browser browser = new Browser();
            RegistryKey browserKey = browserKeys.OpenSubKey(browserNames[i]);
            browser.Name = (string)browserKey.GetValue(null);
            RegistryKey browserKeyPath = browserKey.OpenSubKey(@"shell\open\command");
            browser.Path = browserKeyPath.GetValue(null).ToString().StripQuotes();
            browsers.Add(browser);
            if (browser.Path != null)
                browser.Version = FileVersionInfo.GetVersionInfo(browser.Path).FileVersion;
            else
                browser.Version = "unknown";
        }

        Browser edgeBrowser = GetEdgeVersion();
        if (edgeBrowser != null)
        {
            browsers.Add(edgeBrowser);
        }
        return browsers;
    }

    private Browser GetEdgeVersion()
    {
        RegistryKey edgeKey =
            Registry.CurrentUser.OpenSubKey(
                @"SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\Schemas");
        if (edgeKey != null)
        {
            string version = edgeKey.GetValue("PackageFullName").ToString().StripQuotes();
            Match result = Regex.Match(version, "(((([0-9.])\\d)+){1})");
            if (result.Success)
            {
                return new Browser
                {
                    Name = "MicrosoftEdge",
                    Version = result.Value
                };
            }
        }
        return null;
    }

返回的对象是简单的数据传输对象(DTO):

public class Browser{
     public string Name { get; set; }
     public string Path { get; set; }
     public string Version { get; set; }
}

谢谢你。 - Andrew Truckle
1
问题:GetEdgeVersion填充了NameVersion但未填充Path - Andrew Truckle

11

查看本地机器注册表...

Microsoft.Win32.RegistryKey key =           
Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet");
var browsers = key.GetSubKeyNames();

很高兴能帮忙 :) 当然,你的应用程序需要在管理员权限下运行... - caner
1
不幸的是,尽管我已经安装了Vivaldi浏览器,但“StartMenuInternet”键只有“Internet Explorer”子键! - user1580348
Vivaldi有安装为每个用户的选项。请检查HKLU。 - John Hanley

2

-1
据我所知,Windows 没有浏览器列表。
但是,您可以通过简单地测试 *.exe 文件是否存在来检查浏览器的存在:
if (File.Exists(@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe") || 
    File.Exists(@"C:\Program Files\Google\Chrome\Application\chrome.exe")) {
    // chrome is installed
}

if (File.Exists(@"C:\Program Files (x86)\Mozilla Firefox\firefox.exe") ||
    File.Exists(@"C:\Program Files\Mozilla Firefox\firefox.exe") {
   // firefox is installed
}

安装浏览器时,最终用户可以修改安装目录。 - Vivek Jaiswal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接