2013-04-23 9 views
92

Ich habe eine Selen-Test-Suite, die viele Tests ausführt und bei jedem neuen Test öffnet sie ein Browser-Fenster über anderen Fenstern, die ich geöffnet habe. Sehr störend bei der Arbeit in einer lokalen Umgebung. Irgendeine Möglichkeit, Selen oder das Betriebssystem (MAC) zu sagen, die Fenster im Hintergrund zu öffnen?Kann Selenium Webdriver Browserfenster still im Hintergrund öffnen?

+0

Wenn Sie tun ' Treiber = Webtreiber.Firefox() 'in Ihrem Code, folgen Sie meiner Antwort hier: http://Stackoverflow.com/a/23898148/1515819 –

Antwort

47

Es gibt ein paar Möglichkeiten, aber es ist nicht einfach "setzen Sie einen Konfigurationswert". Sofern Sie in einem Headless Browser investieren, die alle Anforderungen nicht entspricht, ist es ein bisschen wie ein Hack:

How to hide Firefox window (Selenium WebDriver)?

und

Is it possible to hide the browser in Selenium RC?

Sie können 'angeblich', Übergeben Sie einige Parameter in Chrome, speziell: --no-startup-window

Beachten Sie, dass für einige Browser, vor allem IE, es Ihre Tests verletzt, um es nicht im Fokus zu haben.

Sie können auch etwas mit AutoIT hacken, um das Fenster zu verbergen, sobald es geöffnet ist.

+0

" --no-Startup-Fenster "ist jetzt veraltet –

4

Unter Windows können Sie verwenden win32gui:

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 - send_keys Methode macht das Fenster zeigen sich mit. Sie können mit Hilfe von JavaScript damit umgehen, die nicht Fenster nicht zeigen:

def send_keys_without_opening_window(id_of_the_element, keys) 
    YourWebdriver.execute_script("document.getElementById('" +id_of_the_element+"').value = '"+keys+"';") 
97

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. Unter Ubuntu erste Xvfb installieren:

sudo apt-get install xvfb 

dann PyVirtualDisplay von PyPI installieren:

pip install pyvirtualdisplay 

Beispiel Selen Skript in Python in einem Headless 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() 

EDIT Die erste Antwort wurde im Jahr 2014 veröffentlicht und jetzt sind wir an der Schwelle von 2018.Wie alles andere haben Browser auch fortgeschritten. Chrome verfügt jetzt über eine vollständig kopflose Version, sodass keine Bibliotheken von Drittanbietern mehr benötigt werden, um das UI-Fenster zu verbergen.Beispielcode ist 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() 
+0

Eine schöne, saubere Lösung. Dank dafür. Klappt wunderbar. Verdient mehr + 1s – Eldamir

+7

Ist es für Mac OSX verfügbar? – vanguard69

+0

Das ist großartig, wenn Sie Ubuntu verwenden und Ihre Testsuite in Python ist. – kevzettler

7

Ich schlage vor, mit Phantom Js für weitere Informationen Sie Phantom Official Website

Was besuchen müssen, wie ich weiß, PhantomJS arbeiten nur mit Firefox ..

nach dem Download PhantomJs.exe müssen Sie in Ihr Projekt importieren, wie Sie in der Abbildung sehen können Phantomjs ist innerhalb gemeinsamen >>Libra ry >>phantomjs.exe enter image description here

Jetzt alles, was Sie in Ihrem Selenium Code haben, ist die Linie

browser = webdriver.Firefox() 

Um so etwas wie

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

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

Das war es, es funktionierte für mich. und auf jeden Fall wird er für Sie arbeitet zu, Prost

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile des antworten Sie hier und geben Sie den Link als Referenz an. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – slfan

0

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

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

Kopieren Sie die EXE aus dem Ordner ist im Download und Paste im Ordner debug/release des Visual Studio-Projekts.

Fügen Sie diese mit

using OpenQA.Selenium.PhantomJS; 

In Ihrem Code den Fahrer wie folgt geöffnet:

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

Chrome 57 hat eine Option, die --headless Flagge passieren, die das Fenster unsichtbar macht.

Dieses Flag unterscheidet sich vom --no-Startup-Fenster, da das letzte kein Fenster startet. Es wird verwendet, um Hintergrund-Apps zu hosten, wie this page sagt.

Java-Code unter der Flagge zu Selenium WebDriver (ChromeDriver) weitergeben müssen:

ChromeOptions options = new ChromeOptions(); 
options.addArguments("--headless"); 
ChromeDriver chromeDriver = new ChromeDriver(options); 
+0

Wissen Sie, ob es möglich ist, dasselbe in VBA-Sprache zu tun? – Martin

+0

@Martin Ich weiß nicht, ob Ihr Problem bereits behoben wurde oder nicht, aber nach einer schnellen Suche fand ich diese: https://github.com/prajaktamoghe/selenium-vba/issues/33 https: // stackoverflow .com/fragen/45121955/how-can-i-use-chrome-options-in-vba-with-selen Hilft Ihnen das? – in016hoe

0

Für läuft ohne Browser, können Sie es in kopflos Modus laufen kann.

zeige ich Ihnen ein Beispiel in Python, die jetzt für mich arbeitet

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 auch fügen Sie ein bisschen mehr Informationen zu dieser in der offiziellen Google-Website https://developers.google.com/web/updates/2017/04/headless-chrome