Selenium WebDriver ließt WebSocket

Teil 4 von 7 der Serie Sockets

Ist es möglich Websockets-Kommunikation mitzulesen?

Die kurze Antwort ist: man kann es nicht. Zumindest nicht direkt

Über eine Krücke geht es eben doch, nämlich über das spezielle Feature Performance Logging im ChromeDriver. Damit können die übertragenen Nachrichten eingesammelt werden. Man sollte daran denken, wenn man selbst eine Anwendung schreibst und sich auf vermeintlich sicherem Terrain wähnt.

Der Folgende Code sammelt ein paar Sekunden lang Nachrichten von einer Realtime-Website und gibt dann die Kommunikationsinhalte aus.

package de.st.selenium.msg;

import org.json.JSONObject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.logging.Level;


public class CaptureData {
    private static WebDriver driver;

    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/lib/chromedriver");
        LoggingPreferences loggingprefs = new LoggingPreferences();
        loggingprefs.enable(LogType.PERFORMANCE, Level.ALL);

        DesiredCapabilities cap = new DesiredCapabilities().chrome();
        cap.setCapability(CapabilityType.LOGGING_PREFS, loggingprefs);

        driver = new ChromeDriver(cap);
        driver.navigate().to("https://www.godmode-trader.de/indizes/s-and-p-500-index-kurs,133954/komponenten");
        Thread.sleep(10000);
        LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE);

        driver.close();
        driver.quit();
        logEntries.forEach(entry -> {
            JSONObject messageJSON = new JSONObject(entry.getMessage());
            String method = messageJSON.getJSONObject("message").getString("method");
            if (method.equalsIgnoreCase("Network.webSocketFrameSent")) {
                System.out.println("Gesendet: " + messageJSON.getJSONObject("message").getJSONObject("params").getJSONObject("response").getString("payloadData"));
            } else if (method.equalsIgnoreCase("Network.webSocketFrameReceived")) {
                System.out.println("Empfangen: " + messageJSON.getJSONObject("message").getJSONObject("params").getJSONObject("response").getString("payloadData"));
            }
        });
    }
}

Damit das läuft, werden nur zwei Libraries benötigt

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180813</version>
        </dependency>
    </dependencies>

Series Navigation<< TLS Socket, SSL SocketMulticast >>