Kann Selenium Webdriver Browserfenster stillschweigend im Hintergrund öffnen?

160

Ich habe eine Selentestsuite, die viele Tests ausführt, und bei jedem neuen Test wird ein Browserfenster über allen anderen geöffneten Fenstern geöffnet. Sehr nervig bei der Arbeit in einer lokalen Umgebung. Gibt es eine Möglichkeit, Selen oder dem Betriebssystem (MAC) anzuweisen, die Fenster im Hintergrund zu öffnen?

kevzettler
quelle
Wenn Sie driver = webdriver.Firefox() in Ihrem Code tun , folgen Sie meiner Antwort hier: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert
@ StéphaneBruckert Gibt es so etwas für Chrome?
E.Praneeth
stackoverflow.com/a/48775203/1207193 ist die funktionierende Lösung 2020 GoogleChrome Windows
eusoubrasileiro

Antworten:

64

Es gibt einige Möglichkeiten, aber es ist kein einfaches "Festlegen eines Konfigurationswerts". Wenn Sie nicht in einen kopflosen Browser investieren, der nicht allen Anforderungen entspricht, ist dies ein kleiner Hack:

Wie verstecke ich das Firefox-Fenster (Selenium WebDriver)?

und

Ist es möglich, den Browser in Selenium RC auszublenden?

Sie können "angeblich" einige Parameter an Chrome übergeben, insbesondere: --no-startup-window

Beachten Sie, dass es bei einigen Browsern, insbesondere im Internet Explorer, Ihren Tests schadet, wenn sie nicht im Fokus ausgeführt werden.

Sie können mit AutoIT auch ein bisschen hacken, um das Fenster nach dem Öffnen auszublenden.

Arran
quelle
8
"--no-startup-window" ist jetzt veraltet
Corey Goldberg
2
Verwenden Sie in der Tat "--headless" anstelle von "--no-startup-window". Ich habe bestätigt, dass es auf Mac und Chrome v80 funktioniert
Loaderon
178

Wenn Sie den Selenium-Webtreiber mit Python verwenden, können Sie PyVirtualDisplay verwenden, einen Python-Wrapper für Xvfb und Xephyr.

PyVirtualDisplay benötigt Xvfb als Abhängigkeit. Installieren Sie unter Ubuntu zuerst Xvfb:

sudo apt-get install xvfb

Installieren Sie dann PyVirtualDisplay von Pypi:

pip install pyvirtualdisplay

Beispiel eines Selenium-Skripts in Python in einem kopflosen Modus mit PyVirtualDisplay:

    #!/usr/bin/env python

    from pyvirtualdisplay import Display
    from selenium import webdriver

    display = Display(visible=0, size=(800, 600))
    display.start()

    # now Firefox will run in a virtual display. 
    # you will not see the browser.
    browser = webdriver.Firefox()
    browser.get('http://www.google.com')
    print browser.title
    browser.quit()

    display.stop()

BEARBEITEN Die erste Antwort wurde 2014 veröffentlicht und jetzt stehen wir kurz vor 2018. Wie alles andere haben auch die Browser Fortschritte gemacht. Chrome verfügt jetzt über eine vollständig kopflose Version, bei der keine Bibliotheken von Drittanbietern mehr zum Ausblenden des UI-Fensters verwendet werden müssen. Der Beispielcode lautet wie folgt:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options

    CHROME_PATH = '/usr/bin/google-chrome'
    CHROMEDRIVER_PATH = '/usr/bin/chromedriver'
    WINDOW_SIZE = "1920,1080"

    chrome_options = Options()  
    chrome_options.add_argument("--headless")  
    chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
    chrome_options.binary_location = CHROME_PATH

    driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,
                              chrome_options=chrome_options
                             )  
    driver.get("https://www.google.com")
    driver.get_screenshot_as_file("capture.png")
    driver.close()
Amistad
quelle
Eine schöne, saubere Lösung. Dank dafür. Klappt wunderbar. Verdient mehr + 1s
Eldamir
9
Ist es für Mac OSX verfügbar?
Avantgarde69
Dies ist großartig, wenn Sie Ubuntu verwenden und Ihre Testsuite in Python ist
kevzettler
Sieh dir das an. stackoverflow.com/questions/944086/…
Amistad
1
Die Verwendung von chrome_options ist veraltet, jetzt gibt es nur noch Optionen
Mojimi
38

Chrome 57 bietet die Option, das Flag --headless zu übergeben, wodurch das Fenster unsichtbar wird.

Dieses Flag unterscheidet sich vom --no-startup-Fenster, da das letzte kein Fenster startet. Es wird zum Hosten von Hintergrund-Apps verwendet, wie auf dieser Seite angegeben .

Java-Code zum Übergeben des Flags an den Selenium-Webdriver (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
quelle
Wissen Sie, ob es möglich ist, dasselbe in der VBA-Sprache zu tun?
Martin
@Martin Ich weiß nicht, ob Ihr Problem bereits behoben wurde oder nicht, aber nach einer schnellen Suche habe ich folgende gefunden: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/… Tut dies dir helfen?
Marlies
19

Wenn Sie ohne Browser arbeiten, können Sie es im Headless- Modus ausführen .

Ich zeige Ihnen ein Beispiel in Python, das gerade für mich funktioniert

from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument("headless")
self.driver = webdriver.Chrome(executable_path='/Users/${userName}/Drivers/chromedriver', chrome_options=options)

Ich füge Ihnen auch ein bisschen mehr Informationen dazu auf der offiziellen Google-Website https://developers.google.com/web/updates/2017/04/headless-chrome hinzu

Gonzalo Sanchez Kanu
quelle
Einfachste Antwort von allen!
MarcioPorto
funktionierte sehr reibungslos ab Juni 2020
Jonny Boy
15

Seit Chrome 57 haben Sie das kopflose Argument:

var options = new ChromeOptions();
options.AddArguments("headless");
using (IWebDriver driver = new ChromeDriver(options))
{
    // the rest of your test
}

Der Headless-Modus von Chrome bietet eine um 30,97% bessere Leistung als die UI-Version. Der andere Headless-Treiber PhantomJS liefert 34,92% mehr als der Headless-Modus des Chrome.

PhantomJSDriver

using (IWebDriver driver = new PhantomJSDriver())
{
     // the rest of your test
}

Der Headless-Modus von Mozilla Firefox bietet eine um 3,68% bessere Leistung als die UI-Version. Dies ist eine Enttäuschung, da der Headless-Modus von Chrome eine um> 30% bessere Zeit als der UI-Modus erzielt. Der andere Headless-Treiber PhantomJS liefert 34,92% mehr als der Headless-Modus des Chrome. Überraschenderweise schlägt der Edge-Browser alle.

var options = new FirefoxOptions();
options.AddArguments("--headless");
{
    // the rest of your test
}

Dies ist ab Firefox 57+ verfügbar

Der Headless-Modus von Mozilla Firefox bietet eine um 3,68% bessere Leistung als die UI-Version. Dies ist eine Enttäuschung, da der Headless-Modus von Chrome eine um> 30% bessere Zeit als der UI-Modus erzielt. Der andere Headless-Treiber PhantomJS liefert 34,92% mehr als der Headless-Modus des Chrome. Überraschenderweise schlägt der Edge-Browser alle.

Hinweis: PhantomJS wird nicht mehr gewartet!

Anton Angelov
quelle
8

Ich schlage vor, Phantom Js für weitere Informationen zu verwenden, die Sie benötigen, um die offizielle Phantom-Website zu besuchen

Soweit ich weiß, funktioniert PhantomJS nur mit Firefox.

Nach dem Herunterladen von PhantomJs.exe müssen Sie in Ihr Projekt importieren, wie Sie im Bild unten sehen können. Phantomjs befindet sich in der allgemeinen >> Bibliothek >> phantomjs.exe Geben Sie hier die Bildbeschreibung ein

Jetzt müssen Sie in Ihrem Selenium-Code nur noch die Zeile ändern

browser = webdriver.Firefox()

Zu so etwas

import os
path2phantom = os.getcwd() + "\common\Library\phantomjs.exe"
browser = webdriver.PhantomJS(path2phantom)

Der Pfad zu Phantomjs kann anders sein ... ändern Sie, wie Sie möchten :)

Das war's, es hat bei mir funktioniert. und auf jeden Fall wird er für Sie arbeiten, Prost

Ayoub
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert
slfan
7

Unter Windows können Sie win32gui verwenden:

import win32gui
import win32con
import subprocess

class HideFox:
    def __init__(self, exe='firefox.exe'):
        self.exe = exe
        self.get_hwnd()


    def get_hwnd(self):
      win_name = get_win_name(self.exe)
      self.hwnd = win32gui.FindWindow(0,win_name)


    def hide(self):
        win32gui.ShowWindow(self.hwnd, win32con.SW_MINIMIZE)
        win32gui.ShowWindow(self.hwnd, win32con.SW_HIDE)

    def show(self):
        win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
        win32gui.ShowWindow(self.hwnd, win32con.SW_MAXIMIZE)

def get_win_name(exe):
    '''simple function that gets the window name of the process with the given name'''
    info = subprocess.STARTUPINFO()
    info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    raw=subprocess.check_output('tasklist /v /fo csv', startupinfo=info).split('\n')[1:-1]
    for proc in raw:
        try:
            proc=eval('['+proc+']')
            if proc[0]==exe:
                return proc[8]             
        except:
            pass
    raise ValueError('Could not find a process with name '+exe)

Beispiel:

hider=HideFox('firefox.exe')  #can be anything, eq: phantomjs.exe, notepad.exe ...
#To hide the window
hider.hide()
#To show again
hider.show()

Bei dieser Lösung gibt es jedoch ein Problem: Wenn Sie die Methode send_keys verwenden, wird das Fenster angezeigt. Sie können damit umgehen, indem Sie Javascript verwenden, das kein Fenster anzeigt:

def send_keys_without_opening_window(id_of_the_element, keys)
    YourWebdriver.execute_script("document.getElementById('" +id_of_the_element+"').value = '"+keys+"';")
Piotr Dabkowski
quelle
5

Ich habe diesen Code für Firefox in Windows verwendet und die Antwort erhalten: (Referenz hier )

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

Options = Options()
Options.headless = True

Driver = webdriver.Firefox(options=Options, executable_path='geckodriver.exe')
Driver.get(...)
...

Aber ich teste es nicht für andere Browser.

NaabNuts
quelle
Die Frage ist bereits beantwortet und der Autor hat die Antwort bereits genehmigt.
Sariq Shaikh
4
Ich antwortete für andere Leute, die diesen Beitrag sehen werden
NaabNuts
1
Vielen Dank, dass Sie uns die Firefox-Alternative gegeben haben
TimDC
Gern geschehen. Wenn Sie Fragen zu Selen und Django haben, werde ich Ihnen antworten.
NaabNuts
Funktioniert auch in Chrom!
Heisenberg
2

Es kann in Optionen sein. Hier ist der identische Java-Code.

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
Rinjan
quelle
1

Dies ist eine einfache NodeJS-Lösung, die in der neuen Version 4.x (möglicherweise auch 3.x) von Selen funktioniert.

Chrom:

const { Builder } = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome');

let driver = await new Builder().forBrowser('chrome').setChromeOptions(new chrome.Options().headless()).build()

await driver.get('https://example.com')

Feuerfuchs:

const { Builder } = require('selenium-webdriver')
const firefox = require('selenium-webdriver/firefox');

let driver = await new Builder().forBrowser('firefox').setFirefoxOptions(new firefox.Options().headless()).build()

await driver.get('https://example.com')

Das Ganze läuft nur im Hintergrund. Genau das, was wir wollen.

ndsvw
quelle
1

Wenn Sie einen Chrome-Treiber verwenden, können Sie diesen sehr einfachen Code verwenden: (es hat bei mir funktioniert)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome('chromedriver2_win32/chromedriver.exe', options=chrome_options)
driver.get('https://www.anywebsite.com')
Majid A.
quelle
0

Unter * nix können Sie auch einen kopflosen X-Server wie Xvfb ausführen und die Variable DISPLAY darauf verweisen:

Gefälschter X-Server zum Testen?

user2645074
quelle
0

Hier ist eine .net-Lösung, die für mich funktioniert hat:

Laden Sie PhantomJs hier herunter http://phantomjs.org/download.html

Kopieren Sie die EXE-Datei aus dem Ordner bin im Download und fügen Sie sie in den Ordner bin debug / release Ihres Visual Studio-Projekts ein.

Fügen Sie dies mit hinzu

using OpenQA.Selenium.PhantomJS;

Öffnen Sie in Ihrem Code den Treiber wie folgt:

PhantomJSDriver driver = new PhantomJSDriver();
using (driver)
{
   driver.Navigate().GoToUrl("http://testing-ground.scraping.pro/login");
   //your code here 
}
Jack Fairfield
quelle
0

Wenn Sie Ubuntu (Gnome) verwenden, besteht eine einfache Problemumgehung darin, das Auto-Move-Fenster der Gnome-Erweiterung zu installieren: https://extensions.gnome.org/extension/16/auto-move-windows/

Stellen Sie dann den Browser (z. B. Chrome) auf einen anderen Arbeitsbereich (z. B. Arbeitsbereich 2) ein. Der Browser wird stillschweigend in einem anderen Arbeitsbereich ausgeführt und stört Sie nicht mehr. Sie können Chrome weiterhin ohne Unterbrechung in Ihrem Arbeitsbereich verwenden.

Bob
quelle
0

Hallo, ich hatte das gleiche Problem mit meinem Chromedriver unter Verwendung von Python und options.add_argument ("headless") hat bei mir nicht funktioniert, aber dann wurde mir klar, wie ich es beheben kann, also bringe ich es in den folgenden Code

opt=webdriver.ChromeOptions()
opt.arguments.append("headless")

Ich hoffe es funktioniert für dich.

Soroush Bn
quelle
0

Eine Möglichkeit, dies zu erreichen, besteht darin, den Browser im Headless-Modus auszuführen. Ein weiterer Vorteil ist, dass Tests schneller ausgeführt werden.

Den folgenden Code finden Sie, um den Headless-Modus im Chrome-Browser einzustellen.

package chrome;
   public class HeadlessTesting {
        public static void main(String[] args) throws IOException{
            System.setProperty("webdriver.chrome.driver",
                    "ChromeDriverPath");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("headless");
            options.addArguments("window-size=1200x600");
            WebDriver driver = new ChromeDriver(options);
            driver.get("https://contentstack.built.io");
            driver.get("https://www.google.co.in/");
            System.out.println("title is: " + driver.getTitle());
            File scrFile = ((TakesScreenshot) driver)
                    .getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(scrFile, new File("pathTOSaveFile"));
            driver.quit();
        }
    }
Navpreet Singh
quelle