2013-04-23 15 views
92

Mam zestaw testów selenu, który uruchamia wiele testów i przy każdym nowym teście otwiera okno przeglądarki na górze każdego innego okna, które mam otwarte. Bardzo drażniące podczas pracy w lokalnym środowisku. Jakikolwiek sposób odróżnienia selenu lub systemu operacyjnego (MAC) od otwierania okien w tle?Czy Selenium Webdriver może otwierać po cichu okna przeglądarki?

+0

Jeśli robisz ' driver = webdriver.Firefox() 'w kodzie, wykonaj moją odpowiedź tutaj: http://stackoverflow.com/a/23898148/1515819 –

Odpowiedz

47

Istnieje kilka sposobów, ale nie jest to proste "ustaw wartość konfiguracji". Chyba, że ​​inwestowanie w bezgłowe przeglądarki, która nie spełnić wymagania każdego z nas, jest to trochę hack:

How to hide Firefox window (Selenium WebDriver)?

i

Is it possible to hide the browser in Selenium RC?

Można „podobno” przekazać pewne parametry do Chrome, w szczególności: --no-startup-window

Należy pamiętać, że w przypadku niektórych przeglądarek, szczególnie IE, testy nie będą działać, aby nie działały.

Możesz również zhakować trochę za pomocą AutoIT, aby ukryć okno po jego otwarciu.

+0

" --no-startup-window "jest teraz przestarzałe –

4

Z okien można użyć 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) 

Przykład:

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

Jednak jest jeden problem z tym rozwiązaniem - przy użyciu metody send_keys sprawia, że ​​okno wyświetlane. Można sobie z nim za pomocą JavaScript, które nie pokazuje okno:

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

Jeśli używasz sterownika WWW Selenium z Pythonem, możesz użyć PyVirtualDisplay, opakowania Pythona dla Xvfb i Xephyr.

PyVirtualDisplay potrzebuje Xvfb jako zależności. Na Ubuntu, należy najpierw zainstalować Xvfb:

sudo apt-get install xvfb 

następnie zainstalować PyVirtualDisplay z PyPI:

pip install pyvirtualdisplay 

Sample selen skrypt w Pythonie w trybie bezgłowe z 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 Początkowa odpowiedź została opublikowana w 2014 roku, a teraz jesteśmy na szczycie 2018 roku. Jak wszystko inne, przeglądarki mają również zaawansowane. Chrome ma teraz całkowicie bezgłową wersję, która eliminuje potrzebę użycia bibliotek innych firm, aby ukryć okno interfejsu użytkownika.Przykładowy kod jest następujący:

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

Piękne, czyste rozwiązanie. Dziękuję za to. Działa jak marzenie. Zasługiwała więcej + 1s – Eldamir

+7

Czy jest dostępna dla Mac OSX? – vanguard69

+0

To jest świetne, jeśli używasz Ubuntu, a twój pakiet testowy jest w Pythonie – kevzettler

7

Proponuję za pomocą Phantom Js uzyskać więcej informacji należy odwiedzić Phantom Official Website

O ile wiem PhantomJS pracować tylko z Firefoksem ..

po pobraniu pliku PhantomJs.exe, który należy zaimportować do projektu, jak widać na zdjęciu poniżej Phantomjs znajduje się wewnątrz często >>Waga ry >>phantomjs.exe enter image description here

Teraz trzeba wewnątrz kodu Selen jest dokonać korekty

browser = webdriver.Firefox() 

do czegoś

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

ścieżce do phantomjs może być inny ... Zmień jak tylko chcesz :)

To wszystko, zadziałało dla mnie. i na pewno będzie pracował dla ciebie, Cheers

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej jest dołączyć istotne elementy odpowiedz tutaj i podaj link do referencji. Odpowiedzi dotyczące linków mogą stać się nieważne, jeśli strona z linkami zmieni się – slfan

0

Oto rozwiązanie .net, który pracował dla mnie:

PhantomJs Wybirz http://phantomjs.org/download.html

Skopiuj .exe z folderu bin w pobierania i pasty w folderze debug/release bin projektu Visual Studio.

Dodaj to za pomocą

using OpenQA.Selenium.PhantomJS; 

W kodzie otworzyć sterownik tak:

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

Chrome 57 ma możliwość zabicia --headless flagę, która sprawia, że ​​okno niewidoczne.

Ta flaga różni się od -no-uruchamiania-okna, ponieważ ostatnia nie uruchamia okna. Jest używany do hostowania aplikacji w tle, jak mówi this page.

kodu Java, aby przejść na flagę Selen webdriver (ChromeDriver):

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

Czy wiesz, czy można to zrobić w języku VBA? – Martin

+0

@Martin Nie wiem, czy twój problem został już naprawiony czy nie, ale po szybkim wyszukiwaniu znalazłem te: https://github.com/prajaktamoghe/selenium-vba/issues/33 https: // stackoverflow .com/questions/45121955/how-can-i-use-chrome-options-in-vba-with-selen Czy to ci pomoże? – in016hoe

0

do biegania bez przeglądarki, można go uruchomić w trybiebezgłowy.

pokażę wam jeden przykład w Pythonie, który pracuje dla mnie teraz

from selenium import webdriver 


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

Dodam wam nieco więcej informacji na ten temat na oficjalnej stronie Google https://developers.google.com/web/updates/2017/04/headless-chrome

Powiązane problemy