13

Die Registerkarte Chrome Dev Tools-Netzwerk verfügt über eine Initiatorspalte, die Ihnen genau anzeigt, welcher Code die Netzwerkanforderung initiiert hat.Programmgesteuertes Abrufen des Webanforderungsinitiators

network tab of chrome dev tools

Ich mag würde in der Lage sein Netzwerk Anfrage Initiator Informationen programmatisch zu bekommen, so konnte ich ein Skript mit einem url und request search string Argumente, und es gibt Informationen darüber, wo jede Anforderung mit einer URL-Zuordnung ausführen request search string kam von auf der Seite bei url. Also angesichts der Argumente www.stackoverflow.com und google die Ausgabe könnte wie folgt aussehen (zeigt URL anfordern, Zeilennummer und URL angefordert):

/ 19 http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
/ 4291 http://www.google-analytics.com/analytics.js 

ich in PhantomJS sah, aber seine onResourceRequested Rückruf bietet keinen Initiator Informationen oder Kontext, aus dem es abgeleitet werden kann, gemäß der Dokumentation: http://phantomjs.org/api/webpage/handler/on-resource-requested.html

Ist es möglich, mit PhantomJS überhaupt zu tun, oder ein anderes Werkzeug oder eine Dienstleistung wie Selen?

UPDATE

Aus den Kommentaren und Antworten so weit es scheint, als ob dies derzeit nicht von Phantom, Selen oder irgendetwas anderes unterstützt. Hier ist ein alternativer Ansatz, der funktionieren könnte: Laden Sie die Seite und alle Assets, und suchen Sie dann alle Vorkommen von request search string in allen Dateien. Wie könnte ich das tun?

+0

Etwas verwandt: http://stackoverflow.com/questions/17650466/how-to-retrieve-the-initiator-of-a-request-when- Erweiterung-chrome-devtool. Ich bezweifle, dass Sie die Initiatoren mit Selen erreichen können, da zum einen die Chrome-Debugger und die Chrome-Entwickler-Tools Chrome-Debugger sind und nicht gleichzeitig laufen können: https://sites.google.com/a/chromium.org/chromedriver/ help/devtools-window-keeps-closing .. – alecxe

+0

'window.performance.getEntries()' hat den ['initiatorType'] (https://w3c.github.io/resource-timing/#widl-PerformanceResourceTiming-initiatorType) für jeden Eintrag, aber nicht mehr als das und es ist nicht genau das, was Sie suchen. – alecxe

Antwort

2

Sie sollten file a feature request im Bugtracker gegen die DevTools. Die Initiatorinformationen werden nicht in das HAR exportiert, sodass es nicht funktioniert. Soweit ich weiß, erlaubt dies keine bestehende API.

0

können Sie Chrome verwenden debugger protocol von einem Prozess außerhalb Chrome oder verwenden Sie die chrome.debugger API in einer Chrome extension (siehe How to retrieve the Initiator of a request when extending Chrome DevTool?).

+1

Die Antwort, die Sie verknüpft haben, besagt, dass dies nicht möglich ist. –

+0

@BenDowling, sagt es, dass bei Verwendung eines [Chrome DevTools Erweiterung] (https://developer.chrome.com/extensions/devtools) und der exponierten Daten durch HAR, dass es nicht möglich ist, aber es ist möglich über die Debugger-API . Ich empfehle [schnüffle das Protokoll] (https://developer.chrome.com/devtools/docs/debugger-protocol#sniffing-the-protocol) wie unter [Debugging over the wire] beschrieben (https://developer.chrome). com/devtools/docs/debugger-protocol # remote), um die erforderlichen APIs zu finden, die Sie benötigen, um Netzwerkdetails usw. zu erhalten, und dann eine Chrome-Erweiterung implementieren, um die gewünschten Daten zu erfassen und verfügbar zu machen. – mfulton26

+0

Ich möchte dies in einem kopflosen Umfeld tun. Würde dafür eine Chrome-Erweiterung funktionieren? Ich denke, mein vorgeschlagener Ansatz, alle Ressourcen für die Suchzeichenfolge zu erfassen, sieht nach dem einfachsten Weg aus. –

1

Ich konnte eine Lösung implementieren, die PhantomJS verwendet, um alle von einer Seite geladenen URLs zu erhalten, und dann eine Kombination aus xargs, curl und grep verwenden, um die Suchzeichenfolge bei diesen URLs zu finden.

Das erste Stück ist PhantomJS dieses Skript, das einfach jede URL durch eine gewünschte Seite gibt:

system = require('system'); 
var page = require('webpage').create(); 

page.onResourceRequested= function(req) { 
    console.log(req.url); 
}; 

page.open(system.args[1], function(status) { 
    phantom.exit(1); 
}); 

Hier in Aktion:

$ phantomjs urls.js http://www.stackoverflow.com | head -n6 
http://www.stackoverflow.com/ 
http://stackoverflow.com/ 
http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
http://cdn.sstatic.net/Js/stub.en.js?v=06bb9dbfaca7 
http://cdn.sstatic.net/stackoverflow/all.css?v=af4b547e0e9f 
http://cdn.sstatic.net/img/share-sprite-new.svg?v=d09c08f3cb07 

Für mein Problem bin ich nicht interessiert in Bildern, und diese können herausgeputzt werden, indem die Phantomjs Arg --load-images=no hinzugefügt werden.

Das zweite Stück nimmt alle URLs und sucht sie. Es reicht nicht, nur die Übereinstimmung auszugeben, ich brauche auch den Kontext, in dem die URL gefunden wurde, und im Idealfall auch die Zeilennummer.Hier ist, wie das tun:

$ cat urls | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})SEARCH_TERM(.{0,30})' | sed 's#^#% #'" 

Wir werden diese alle in einem kleinen Skript wickeln können, wo wir werden Rohr der Ausgabe zurück durch grep farbliche Hervorhebung auf dem Such-String zu erhalten:

#!/bin/bash 
phantomjs --load-images=no urls.js $1 | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})$2(.{0,30})' | sed 's#^#% #' | grep $2 --color=always" 

Wir können es dann verwenden, um nach einem Begriff auf einer beliebigen Site zu suchen. Hier suchen wir adzerk.net auf stackoverflow.com:

enter image description here

So können Sie sehen, dass die adzerk.net Anfrage irgendwo um Zeile eingeleitet wird 4158 der Haupt-Seite Stackoverflow. Es ist keine perfekte Lösung, da der Aufruf irgendwo völlig anders sein kann als wo die URL definiert ist, aber es ist wahrscheinlich ein naher und sicherlich ein guter Punkt, um die genaue Aufrufseite aufzuspüren.

Möglicherweise gibt es eine bessere Möglichkeit, den Inhalt jeder URL zu durchsuchen. Es sieht nicht so aus, als ob der Handler onResourceReceived von PhantonJS derzeit den Inhalt der Ressource offen legt, aber es gibt ongoing work to address that, und sobald das verfügbar ist, wird das alles viel einfacher.