Selenium Webdriver tarayıcı pencerelerini arka planda sessizce açabilir mi?


162

Birçok test çalıştıran bir selenyum test paketi var ve her yeni testte açtığım diğer pencerelerin üstünde bir tarayıcı penceresi açar. Yerel bir ortamda çalışırken çok sarsıcı. Selenyum veya OS'ye (MAC) arka planda pencereleri açmasını söylemenin herhangi bir yolu var mı?


driver = webdriver.Firefox() Kodunuzu yapıyorsanız , cevabımı buradan takip edin: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert

@ StéphaneBruckert Chrome için böyle bir şey var mı?
E.Praneeth

Yanıtlar:


64

Birkaç yol vardır, ancak basit bir "yapılandırma değeri ayarla" değildir. Herkesin gereksinimlerine uymayan başsız bir tarayıcıya yatırım yapmadığınız sürece, bu biraz hack'tir:

Firefox penceresini gizleme (Selenium WebDriver)?

ve

Selenium RC'de tarayıcıyı gizlemek mümkün mü?

'Sözde' bazı parametreleri Chrome'a ​​aktarabilir, özellikle: --no-startup-window

Bazı tarayıcılar, özellikle IE için, odakta çalışmaması için testlerinize zarar vereceğini unutmayın.

Ayrıca, pencereyi açıldıktan sonra gizlemek için AutoIT ile biraz hackleyebilirsiniz.


8
"--no-startup-window" artık kullanımdan kaldırıldı
Corey Goldberg

2
Gerçekten, "--no-startup-window" yerine "--headless" kullanın, Mac ve Chrome v80
Loaderon

178

Python ile Selenium web sürücüsü kullanıyorsanız, Xvfb ve Xephyr için bir Python sarıcı olan PyVirtualDisplay'i kullanabilirsiniz.

PyVirtualDisplay bir bağımlılık olarak Xvfb'ye ihtiyaç duyar. Ubuntu'da, önce Xvfb'yi yükleyin:

sudo apt-get install xvfb

daha sonra Pypi'den PyVirtualDisplay'i kurun:

pip install pyvirtualdisplay

PyVirtualDisplay ile başsız bir modda Python'da Selenyum komut dosyası örneği:

    #!/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 İlk cevap 2014 yılında gönderildi ve şimdi 2018 zirvesindeyiz. Diğer her şey gibi, tarayıcılar da ilerlemiştir. Chrome'un artık tamamen başsız bir sürümü var, bu da UI penceresini gizlemek için herhangi bir üçüncü taraf kitaplığı kullanma ihtiyacını ortadan kaldırıyor. Örnek kod aşağıdaki gibidir:

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

Güzel, temiz bir çözüm. Bunun için teşekkürler. Tıkır tıkır çalışıyor. Daha fazla + 1s hak ediyor
Eldamir

9
Mac OSX için kullanılabilir mi?
vanguard69

Ubuntu kullanıyorsanız ve test takımınız Python'da ise harika
kevzettler


1
chrome_options kullanımı artık kullanılmıyor, şimdi sadece seçenekler
Mojimi

40

Chrome 57, pencereyi görünmez yapan --headless bayrağını geçirme seçeneğine sahiptir.

Bu bayrak --no-startup-window penceresinden farklıdır çünkü sonuncusu bir pencere başlatmaz. Bu sayfada belirtildiği gibi arka plan uygulamalarını barındırmak için kullanılır .

Bayrağı Selenium webdriver'a (ChromeDriver) geçirmek için Java kodu:

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

Aynı şeyi VBA dilinde yapmanın mümkün olup olmadığını biliyor musunuz?
Martin

@Martin Sorununuzun zaten çözülüp çözülmediğini bilmiyorum, ancak hızlı bir aramadan sonra bunları buldum: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/… Bunu yapar sana yardım etmek?
Marlies

19

Herhangi bir tarayıcı olmadan çalıştırmak için, başsız modda çalıştırabilirsiniz .

Python'da şu anda benim için çalışan bir örnek göstereyim

from selenium import webdriver


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

Bunun için size resmi Google web sitesinde https://developers.google.com/web/updates/2017/04/headless-chrome adresinden daha fazla bilgi ekliyorum.


En basit cevap!
MarcioPorto

Haziran 2020 itibariyle çok sorunsuz çalıştı
Jonny Boy

15

Chrome 57'den beri başsız bir argüman var:

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

Chrome'un başsız modu, UI sürümüne göre% 30.97 daha iyi performans gösteriyor. Diğer başsız sürücü PhantomJS, Chrome'un başsız modundan% 34,92 daha iyi sunuyor.

PhantomJSDriver

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

Mozilla Firefox'un başsız modu, UI sürümüne göre% 3.68 daha iyi performans gösteriyor. Chrome'un başsız modu, kullanıcı arayüzünden% 30 daha iyi bir süreye ulaştığından bu bir hayal kırıklığıdır. Diğer başsız sürücü PhantomJS, Chrome'un başsız modundan% 34,92 daha iyi sunuyor. Şaşırtıcı bir şekilde, Edge tarayıcı hepsini yeniyor.

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

Bu Firefox 57+ sürümünden edinilebilir

Mozilla Firefox'un başsız modu, UI sürümüne göre% 3.68 daha iyi performans gösteriyor. Chrome'un başsız modu, kullanıcı arayüzünden% 30 daha iyi bir süreye ulaştığından bu bir hayal kırıklığıdır. Diğer başsız sürücü PhantomJS, Chrome'un başsız modundan% 34,92 daha iyi sunuyor. Şaşırtıcı bir şekilde, Edge tarayıcı hepsini yeniyor.

Not: PhantomJS artık korunmamaktadır!


8

Phantom Resmi Web Sitesini ziyaret etmeniz gereken daha fazla bilgi için Phantom Js kullanmanızı öneririm

Bildiğim kadarıyla PhantomJS sadece Firefox ile çalışıyor ..

PhantomJs.exe indirdikten sonra aşağıdaki resimde gördüğünüz gibi projenize almak gerekir Phantomjs yaygın içinde >> Kütüphane >> phantomjs.exe resim açıklamasını buraya girin

Şimdi Selenyum kodunuzun içinde tek yapmanız gereken satırı değiştirmek

browser = webdriver.Firefox()

Gibi bir şeye

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

Phantomjs yolu farklı olabilir ... istediğiniz gibi değiştirin :)

Hepsi bu, benim için çalıştı. ve kesinlikle senin için çalışacak, Şerefe


Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse yalnızca bağlantı yanıtları geçersiz olabilir
slfan

8

Windows'ta win32gui'yi kullanabilirsiniz:

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)

Misal:

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

Ancak bu çözümle ilgili bir sorun var - send_keys yöntemini kullanarak pencere ortaya çıkıyor. Pencereyi göstermeyen javascript kullanarak başa çıkabilirsiniz:

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

5

Bu kodu Windows'ta Firefox için kullandım ve cevap aldım: ( buraya bakın )

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

Ama bunu diğer tarayıcılar için test etmiyorum.


Soru zaten cevaplandı ve yazar cevabı zaten onayladı.
Sariq Shaikh

4
Bu
yazıyı

1
Bize Firefox alternatifini verdiğiniz için teşekkürler
TimDC

Selenium ve Django hakkında herhangi bir sorunuz varsa size cevap vereceğim.
NaabNuts

Kromda da çalışır!
Heisenberg

3

Seçeneklerde olabilir. İşte aynı java kodu.

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

1

Bu, Selenyum'un yeni 4.x sürümünde (belki de 3.x) çalışan basit bir NodeJS çözümüdür.

Krom:

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

Firefox:

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

Her şey arka planda çalışır. Tam olarak ne istiyoruz.


1

Chrome sürücüsü kullanıyorsanız, bu çok basit kodu kullanabilirsiniz: (benim için çalıştı)

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


0

İşte benim için çalışan bir .net çözümü:

PhantomJ'leri buradan indirin http://phantomjs.org/download.html

.Exe dosyasını indirme klasöründeki bin klasöründen kopyalayın ve Visual Studio projenizin bin hata ayıklama / bırakma klasörüne yapıştırın.

Bunu kullanarak ekle

using OpenQA.Selenium.PhantomJS;

Kodunuzda sürücüyü şu şekilde açın:

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

0

Ubuntu (Gnome) kullanıyorsanız, Gnome uzantısı otomatik taşıma penceresini yüklemek için basit bir çözüm: https://extensions.gnome.org/extension/16/auto-move-windows/

Ardından tarayıcıyı (ör. Chrome) başka bir çalışma alanına (örn. Çalışma Alanı 2) ayarlayın. Tarayıcı sessizce diğer çalışma alanlarında çalışır ve sizi rahatsız etmez. Chrome'u çalışma alanınızda kesintisiz olarak kullanabilirsiniz.


0

merhaba ben python ve options.add_argument ("başsız") kullanarak benim chromedriver ile aynı sorunu vardı benim için işe yaramadı ama sonra nasıl düzeltmek için bu yüzden aşağıdaki kod getirmek

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

umarım senin için çalışır.


0

Bunu başarmanın bir yolu, tarayıcıyı başsız modda çalıştırmaktır. Bunun bir başka avantajı da testlerin daha hızlı yapılmasıdır.

Chrome tarayıcıda başsız modu ayarlamak için lütfen aşağıdaki kodu bulun.

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();
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.