it-swarm.com.de

Kann Selenium Webdriver Browserfenster im Hintergrund unbeaufsichtigt öffnen?

Ich habe eine Selenium-Test-Suite, die viele Tests ausführt. Bei jedem neuen Test wird ein Browser-Fenster über allen anderen geöffneten Fenstern geöffnet. Sehr erschütternd während der Arbeit in einer lokalen Umgebung. Wie kann man Selenium oder das Betriebssystem (MAC) dazu bringen, die Fenster im Hintergrund zu öffnen?

114
kevzettler

Es gibt mehrere Möglichkeiten, aber es ist kein einfacher "Konfigurationswert festlegen". Wenn Sie nicht in einen Headless-Browser investieren, der nicht den Anforderungen aller gerecht wird, ist dies ein bisschen ein Hacker:

Wie verstecke ich Firefox-Fenster (Selenium WebDriver)?

und

Kann man den Browser in Selenium RC ausblenden?

Sie können "vermeintlich" einige Parameter in Chrome eingeben, insbesondere: --no-startup-window

Beachten Sie, dass es bei einigen Browsern, insbesondere beim IE, Ihren Tests schaden wird, wenn der Fokus nicht ausgeführt wird.

Sie können mit AutoIT auch ein bisschen hacken, um das Fenster auszublenden, sobald es geöffnet ist.

52
Arran

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 auf Ubuntu zuerst Xvfb:

Sudo apt-get install xvfb

dann installieren Sie PyVirtualDisplay von Pypi:

pip install pyvirtualdisplay

Beispiel für ein Selenium-Skript in Python mit PyVirtualDisplay im Headless-Modus:

#!/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()

EDIT Die erste Antwort wurde im Jahr 2014 gepostet, und jetzt sind wir an der Schwelle von 2018. Wie alle anderen auch, haben Browser auch Fortschritte gemacht. Chrome bietet jetzt eine komplett kopflose Version, so dass keine Bibliotheken von Drittanbietern zum Ausblenden des Benutzeroberflächenfensters benötigt werden. 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()
132
Amistad

Chrome 57 verfügt über eine Option zum Übergeben der Markierung --headless, wodurch das Fenster unsichtbar wird. 

Dieses Flag unterscheidet sich vom --no-startup-window, da das letzte kein Fenster öffnet. Es wird für das Hosting von Hintergrund-Apps verwendet, wie diese Seite sagt.

Java-Code zum Übergeben der Flagge an den Selenium-Web-Treiber (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
27
Marlies

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 ist 30,97% besser als die UI-Version. Der andere Headless-Treiber PhantomJS ist 34,92% besser als der Headless-Modus von Chrome.

PhantomJSDriver

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

Der Headless-Modus von Mozilla Firefox ist 3,68% besser als die UI-Version. Dies ist eine Enttäuschung, da der Headless-Modus von Chrome eine um 30% bessere Zeit erzielt als der UI-Modus. Der andere Headless-Treiber PhantomJS ist 34,92% besser als der Headless-Modus von 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 ist 3,68% besser als die UI-Version. Dies ist eine Enttäuschung, da der Headless-Modus von Chrome eine um 30% bessere Zeit erzielt als der UI-Modus. Der andere Headless-Treiber PhantomJS ist 34,92% besser als der Headless-Modus von Chrome. Überraschenderweise schlägt der Edge-Browser alle. 

Hinweis: PhantomJS wird nicht mehr gepflegt!

11
Anton Angelov

Ich schlage vor, Phantom Js für weitere Informationen zu verwenden, die Sie besuchen müssen Phantom Official Website

Soweit ich weiß, funktioniert PhantomJS nur mit Firefox.

nach dem Herunterladen von PhantomJs.exe müssen Sie PhantomJs in Ihr Projekt importieren (siehe Abbildung unten). PhantomJs befindet sich in common >> Library >> phantomjs.exe enter image description here

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

browser = webdriver.Firefox()

Um so etwas wie

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

Der Pfad zu Phantombildern kann unterschiedlich sein ... ändere, wie du willst :)

Das war's, es hat bei mir geklappt. und auf jeden Fall wird er für dich arbeiten, Cheers

8
Ayoub

Wenn Sie ohne Browser arbeiten, können Sie es im Modus headless 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 auch ein wenig mehr Informationen dazu auf der offiziellen Google-Website hinzu https://developers.google.com/web/updates/2017/04/4/headless-chrome

Unter Windows können Sie win32gui verwenden:

import win32gui
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, 6)
        win32gui.ShowWindow(self.hwnd, 0)

    def show(self):
        win32gui.ShowWindow(self.hwnd, 5)
        win32gui.ShowWindow(self.hwnd, 3)

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()

Es gibt jedoch ein Problem mit dieser Lösung: Mit der send_keys-Methode 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+"';")
4
Piotr Dabkowski

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

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
0
rinjan

Wenn Sie Ubuntu (Gnome) verwenden, besteht eine einfache Möglichkeit darin, die Gnome-Erweiterung "Auto-Move-Window" 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 im Hintergrund in einem anderen Arbeitsbereich ausgeführt und stört Sie nicht mehr. Sie können Chrome weiterhin ohne Unterbrechung in Ihrem Arbeitsbereich verwenden.

0
Bob

Auf * nix können Sie auch einen X-Server ohne Heads wie Xvfb ausführen und die Variable DISPLAY darauf richten:

Gefälschter X-Server zum Testen?

0
user2645074

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

PhantomJs hier herunterladen http://phantomjs.org/download.html

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

Fügen Sie dies mit hinzu 

using OpenQA.Selenium.PhantomJS;

Öffnen Sie den Treiber in Ihrem Code folgendermaßen:

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