How to enable preserve log option for chrome developer settings->Preferences->Preserve log upon navigation, using chromeoptions.add_argument or by adding the pref to DesiredCapabilities or any other way programmatically.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
You can get redirects from performance
logs. According to docs and github answer here is what I've done in C#, should be possible to port in Python:
var options = new ChromeOptions(); var cap = DesiredCapabilities.Chrome(); var perfLogPrefs = new ChromePerformanceLoggingPreferences(); perfLogPrefs.AddTracingCategories(new string[] { "devtools.network" }); options.PerformanceLoggingPreferences = perfLogPrefs; options.AddAdditionalCapability(CapabilityType.EnableProfiling, true, true); ptions.SetLoggingPreference("performance", LogLevel.All); var driver = new ChromeDriver(options); var url = "https://some-website-that-will-redirect.com/"; driver.Navigate().GoToUrl(url); var logs = driver.Manage().Logs.GetLog("performance"); //all your logs with redirects will be here
Looping through logs
, if message.params.redirectResponse.url
is equal to original URL then message.params.request.url
will contain redirect URL
Node.JS using webdriverio
:
var options = { desiredCapabilities: { browserName: 'chrome', loggingPrefs: { 'browser': 'ALL', 'driver': 'ALL', 'performance': 'ALL' }, chromeOptions: { perfLoggingPrefs: { traceCategories: 'performance' }, } } var client = webdriverio.remote(options); await client.url(url); var logs = await client.log('performance'); var navigations = parseLogs(logs, url); function parseLogs(logs, url) { var redirectList = []; while (true) { var targetLog = (logs.value.find(l => { if (l.message.indexOf(url) == -1) return false; var rootMessage = JSON.parse(l.message); if (((((rootMessage || {}).message || {}).params || {}).redirectResponse || {}).url == url) return true; return false; }) || {}).message; if (!targetLog) break; if (redirectList.indexOf(url) != -1) break; redirectList.push(url); var targetLogObj = JSON.parse(targetLog); var nextUrl = ((((targetLogObj || {}).message || {}).params || {}).request || {}).url; if (nextUrl) { url = nextUrl; continue; } break; } return redirectList; }