如何从Chrome DevTools的“网络”标签中获取URL?

时间:2019-02-25 22:38:41

标签: .net selenium selenium-chromedriver

鉴于某个包含许多资源的网站,我需要使获取所有资源的URL的过程自动化。使事情复杂化的是,这些URL不包含在最初加载的标记中,而是基于用户与页面的交互通过JavaScript通过DOM插入。

因此,我必须从Chrome的DevTools的“网络”标签中检索结果。但是我很难入门。

这是我的第一次尝试:

const compareDicts = (a, b) => JSON.stringify(a) === JSON.stringify(b);

const first = { x: [true, false, true] };
const second = { x: [true, false, true] };
const unequal = { x: [true, true, true] };

console.log(compareDicts(first, second));
console.log(compareDicts(first, unequal));

在此代码的第一次运行中,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

但是,自首次运行以来,未检索到任何日志。而且,这不是我需要的日志。我需要资源网址。

这里要解决三个主要问题:

  1. 从浏览器的本地缓存中检索页面时,它似乎没有输出到日志
  2. 即使我的代码尝试尽早设置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) ,似乎也没有办法
  3. 这些日志不是资源URL

如何从DevTools的“网络”标签中获取URL?我很快找到了sample,实际上是从上面的代码中得到启发的,但是它使用的是Java SDK。这两个API似乎略有不同。

2 个答案:

答案 0 :(得分:0)

根据How to set Chrome preferences using Selenium Webdriver .NET binding?,您将需要自己的课程,例如

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中使用伪网址chrome://tracing/找到跟踪类别。

答案 1 :(得分:0)

您可以使用浏览器日志获取Selenium的所有资源。

 def get_logs(self):
        logs = self.browser.get_log('performance')
        return logs