首页 > 解决方案 > 如何从 Chrome DevTools 网络选项卡获取 URL?

问题描述

给定一个包含许多资源的网站,我需要自动化获取所有资源 URL 的过程。更复杂的是,这些 URL 不包含在最初加载的标记中,而是根据用户与页面的交互通过 JavaScript 插入到 DOM 中。

因此,我必须从 Chrome 的 DevTools 的网络选项卡中检索结果。但我很难开始。

这是我的第一次尝试:

Imports System.Text
Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome
Imports OpenQA.Selenium.Support.UI

Friend Module Main
  Public Sub Main()
    Dim oBuilder As StringBuilder
    Dim oOptions As ChromeOptions
    Dim oDriver As IWebDriver
    Dim oWait As WebDriverWait
    Dim sType As String

    sType = LogType.Browser

    oBuilder = New StringBuilder

    oOptions = New ChromeOptions
    oOptions.SetLoggingPreference(sType, LogLevel.All)

    oDriver = New ChromeDriver(oOptions)
    oDriver.Navigate.GoToUrl("http://example.com")

    oWait = New WebDriverWait(oDriver, TimeSpan.FromSeconds(15))
    oWait.Until(Function(Driver) Driver.FindElement(By.TagName("a")))

    oDriver.Manage.Logs.GetLog(sType).ToList.ForEach(Sub(Log)
                                                       oBuilder.AppendLine($"Level:   {Log.Level}")
                                                       oBuilder.AppendLine($"Message: {Log.Message}")
                                                     End Sub)

    Console.WriteLine(oBuilder.ToString)
  End Sub
End Module

在第一次运行此代码时,StringBuilder仅包含一个LogEntry

Timestamp            Level  Message
---------            -----  -------
2/25/2019 5:05:05 PM Severe http://example.com/favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)

但是,自从第一次运行以来,没有检索到任何日志。而且,这不是我需要的日志。我需要资源 URL。

这里需要克服三个主要问题:

  1. 从浏览器的本地缓存中检索页面时,似乎没有输出到日志
  2. 似乎没有办法设置LogLevel,即使我的代码很早就尝试这样做
  3. 这些日志不是资源 URL

如何从 DevTools Network 选项卡获取 URL?我找到了这个快速示例——实际上它启发了我上面的代码——但它使用的是 Java SDK。这两个 API 似乎略有不同。

标签: .netseleniumselenium-chromedriver

解决方案


根据如何使用 Selenium Webdriver .NET binding 设置 Chrome 首选项?您将需要自己的课程,例如

public class ChromeOptionsWithPrefs: ChromeOptions
{
    public Dictionary<string,object> prefs { get; set; }
}

public static void Initialize()
{
    var options = new ChromeOptionsWithPrefs();
    options.prefs = new Dictionary<string, object>
    {
        { "enableNetwork", true },
        { "traceCategories", "netlog,devtools.timeline,devtools" }
    };
    _driver = new ChromeDriver(@"C:\path\chromedriver", options);
}

我无法验证代码,但在 Java 中,您需要像那样启用网络日志记录。可以使用chrome://tracing/Chrome 中的伪 url 找到跟踪类别。


推荐阅读