8 Stimmen

Selenium headless ohne xvfb ausführen

Ich versuche, Selenium headless auszuführen (ohne dass der Browser angezeigt wird). Andere Fragen haben auf Folgendes hingewiesen xvfb als Werkzeug für diese Aufgabe. Es scheint jedoch sehr instabil zu sein und stürzt ständig ab, so dass ich nach einer anderen Alternative suche.

Gibt es eine nicht-xvfb Weise der Ausführung von Selenium Headless?

14voto

Jo Liss Punkte 27127

Ich glaube nicht, dass Sie einen Browser ohne einen X-Server betreiben können.

Wenn Sie Xvfb nicht mögen, dann ist es, wie Pascal schon sagte, am besten, wenn Sie einen VNC-Server verwenden - ich persönlich mag Xtightvnc . Das bedeutet, dass Sie einen (kopflosen) X-Server betreiben, auf den Sie jederzeit per VNC zugreifen können, für den Fall, dass etwas schief geht und Sie es sich ansehen wollen. Ich habe immer einen VNC-Server laufen, und ich führe meine Tests mit der Umgebungsvariablen $DISPLAY aus, die auf diesen Server zeigt.

(Jemand hat mich heruntergestuft, also sollte ich vielleicht klarstellen: X11-VNC-Server wie Xtightvnc sind nicht dasselbe wie die üblichen VNC-Server unter Windows oder OS X, die einfach Ihren vorhandenen Bildschirm im Netzwerk freigeben würden. Nicht verwechseln. ;-) )

0 Stimmen

Exzellente Antwort -- vor allem, da RHEL Xvfb nicht mehr in den yum-Repositories zu haben scheint. tigervnc est dort jedoch nicht. Ich würde also sagen, dass dies eine viel offiziellere Lösung ist, doch wenn man googelt, scheint man zuerst zu xvfb zu gelangen...

0 Stimmen

Cool, aber manche Benutzer wissen vielleicht nicht, wie sie es benutzen sollen. Könnten Sie ein paar Beispiele hinzufügen? z.B.: run $ vncserver prüfen Sie den Ausgabeindex New 'X' desktop is host:1 und verwenden Sie es dann, um Ihren Befehl auszuführen, zum Beispiel für xcalc $ DISPLAY=:1 xcalc . Sie können auch sehen, was auf dem Display zu sehen ist: $ vncviewer localhost:59XX

6voto

Pascal Thivent Punkte 548176

Ich bin erstaunt. Ich habe Selenium und Xvfb mehrere Male ohne Probleme verwendet und viele andere Benutzer tun dies auch. Können Sie Ihre Einrichtung und die Probleme, die Sie haben, genauer beschreiben? Wie starten Sie Xvfb? Können Sie Folgendes angeben xvfb.log ?

Um Ihre Frage zu beantworten, ist es jedoch möglich, einen X-VNC-Server zu verwenden. Siehe zum Beispiel diese Seite für einige Anweisungen. Ohne Details über Ihre Konfiguration ist es schwer, genauere Angaben zu machen.

0 Stimmen

Ich denke, das Problem von xvfb war folgendes: wiki.maemo.org/ . xvfb fühlte sich immer wie eine seltsame Lösung an, also hatte ich sowieso nach einer anderen Methode gesucht (obwohl VNC sich genauso anfühlt :-/). Danke!

2 Stimmen

Wenn Sie das Problem gefunden haben, dann haben Sie wohl auch die Lösung gefunden, oder?

0 Stimmen

Das dachte ich mir schon. Ich habe die Korrektur angewendet, es sah gut aus, aber es ist immer noch kaputt. bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/330052 scheint das Problem zu sein.

1voto

LocalOps Punkte 11

Führen Sie den Chrome-Browser mit --headless aus, so können Sie auch den Ressourcenverbrauch reduzieren. ChromeOptions.addArguments("--headless", "window-size=1024,768", "--no-sandbox") um es zu erreichen. Dieses Schema setzt voraus, dass der Chrome-Browser und Chromedriver installiert sind.

Hier ist mein einfacher Selenium-Java-Test, der in meinem Jenkins-Job verwendet wird

    package com.gmail.email;

import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class FirstTest {
    private static ChromeDriver driver;
    WebElement element;

    @BeforeClass
    public static void openBrowser(){

        ChromeOptions ChromeOptions = new ChromeOptions();
        ChromeOptions.addArguments("--headless", "window-size=1024,768", "--no-sandbox");
        driver = new ChromeDriver(ChromeOptions);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @Test // Marking this method as part of the test
    public void gotoHelloWorldPage() {
        // Go to the Hello World home page
        driver.get("http://webapp:8080/helloworld/");

        // Get text from heading of the Hello World page
        String header = driver.findElement(By.tagName("h2")).getText();
        // Verify that header equals "Hello World!"
        Assert.assertEquals(header, "Hello World!");

    }

    @AfterClass
    public static void closeBrowser(){
        driver.quit();
    }
}

Weitere Einzelheiten hier https://github.com/SeleniumHQ/docker-selenium/issues/429

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X