Bisakah Selenium Webdriver membuka jendela browser secara diam-diam di latar belakang?

162

Saya memiliki suite tes selenium yang menjalankan banyak tes dan pada setiap tes baru itu membuka jendela browser di atas semua jendela lain yang saya buka. Sangat menggelegar saat bekerja di lingkungan lokal. Adakah cara untuk memberitahu selenium atau OS (MAC) untuk membuka jendela di latar belakang?

kevzettler
sumber
Jika Anda melakukan driver = webdriver.Firefox() dalam kode Anda, ikuti jawaban saya di sini: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert
@ StéphaneBruckert Apakah ada yang seperti itu untuk Chrome?
E.Petheth
stackoverflow.com/a/48775203/1207193 adalah solusi yang berfungsi 2020 GoogleChrome Windows
eusoubrasileiro

Jawaban:

64

Ada beberapa cara, tetapi itu tidak sederhana "menetapkan nilai konfigurasi". Kecuali Anda berinvestasi di peramban tanpa kepala, yang tidak sesuai dengan persyaratan semua orang, ini sedikit meretas:

Bagaimana cara menyembunyikan jendela Firefox (Selenium WebDriver)?

dan

Apakah mungkin menyembunyikan browser di Selenium RC?

Anda dapat 'seharusnya', memasukkan beberapa parameter ke Chrome, khususnya: --no-startup-window

Perhatikan bahwa untuk beberapa browser, terutama IE, itu akan merusak tes Anda untuk tidak menjalankannya dalam fokus.

Anda juga dapat meretas sedikit dengan AutoIT, untuk menyembunyikan jendela begitu dibuka.

Arran
sumber
8
"--tidak ada-startup-jendela" sekarang sudah tidak digunakan lagi
Corey Goldberg
2
memang, gunakan "- tanpa kepala" bukan "--tidak ada-startup-jendela", saya telah mengkonfirmasi itu berfungsi di Mac dan Chrome v80
Loaderon
178

Jika Anda menggunakan driver web Selenium dengan Python, Anda dapat menggunakan PyVirtualDisplay, pembungkus Python untuk Xvfb dan Xephyr.

PyVirtualDisplay membutuhkan Xvfb sebagai ketergantungan. Di Ubuntu, instal Xvfb:

sudo apt-get install xvfb

kemudian instal PyVirtualDisplay dari Pypi:

pip install pyvirtualdisplay

Contoh skrip Selenium dalam Python dalam mode tanpa kepala dengan 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 Jawaban awal telah diposting pada tahun 2014 dan sekarang kita berada di puncak tahun 2018. Seperti yang lainnya, browser juga telah maju. Chrome memiliki versi yang sepenuhnya tanpa kepala sekarang yang menghilangkan kebutuhan untuk menggunakan perpustakaan pihak ketiga mana pun untuk menyembunyikan jendela UI. Kode sampel adalah sebagai berikut:

    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
sumber
Solusi yang indah dan bersih. Terima kasih untuk itu. Bekerja seperti pesona. Lebih
layak diberi
9
Apakah tersedia untuk Mac OSX?
vanguard69
Ini bagus jika Anda menggunakan Ubuntu dan ruang tes Anda menggunakan Python
kevzettler
1
penggunaan chrome_options sudah tidak digunakan lagi, sekarang hanya opsi
Mojimi
40

Chrome 57 memiliki opsi untuk melewati flag - headless, yang membuat jendela tidak terlihat.

Bendera ini berbeda dari --no-startup-window karena yang terakhir tidak meluncurkan jendela. Ini digunakan untuk hosting aplikasi latar belakang, seperti yang dikatakan halaman ini .

Kode Java untuk meneruskan bendera ke webdriver Selenium (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
sumber
Apakah Anda tahu apakah mungkin untuk melakukan hal yang sama dalam bahasa VBA?
Martin
@ Martin Saya tidak tahu apakah masalah Anda sudah diperbaiki atau tidak, tetapi setelah pencarian cepat saya menemukan itu: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/… Melakukan ini tolong kamu?
Marlies
19

Untuk menjalankan tanpa browser apa pun, Anda dapat menjalankannya dalam mode tanpa kepala .

Saya tunjukkan satu contoh dalam Python yang bekerja untuk saya sekarang

from selenium import webdriver


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

Saya juga menambahkan Anda sedikit lebih banyak info tentang ini di situs web Google resmi https://developers.google.com/web/updates/2017/04/headless-chrome

Gonzalo Sanchez cano
sumber
Jawaban paling sederhana dari semuanya!
MarcioPorto
bekerja dengan sangat lancar pada Juni 2020
Jonny Boy
15

Karena Chrome 57 Anda memiliki argumen tanpa kepala:

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

Mode tanpa kepala Chrome berperforma 30,97% lebih baik daripada versi UI. Pengemudi tanpa kepala lainnya PhantomJS menghasilkan 34,92% lebih baik daripada mode tanpa kepala Chrome.

PhantomJSDriver

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

Mode tanpa kepala dari Mozilla Firefox memiliki kinerja 3,68% lebih baik daripada versi UI. Ini mengecewakan karena mode tanpa kepala Chrome mencapai waktu> 30% lebih baik daripada UI. Pengemudi tanpa kepala lainnya PhantomJS menghasilkan 34,92% lebih baik daripada mode tanpa kepala Chrome. Yang mengejutkan bagi saya, browser Edge mengalahkan mereka semua.

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

Ini tersedia dari Firefox 57+

Mode tanpa kepala dari Mozilla Firefox memiliki kinerja 3,68% lebih baik daripada versi UI. Ini mengecewakan karena mode tanpa kepala Chrome mencapai waktu> 30% lebih baik daripada UI. Pengemudi tanpa kepala lainnya PhantomJS menghasilkan 34,92% lebih baik daripada mode tanpa kepala Chrome. Yang mengejutkan bagi saya, browser Edge mengalahkan mereka semua.

Catatan: PhantomJS tidak dipertahankan lagi!

Anton Angelov
sumber
8

Saya sarankan menggunakan Phantom Js untuk info lebih lanjut Anda perlu mengunjungi Situs Web Resmi Phantom

Sejauh yang saya tahu PhantomJS hanya bekerja dengan Firefox ..

setelah mengunduh PhantomJs.exe, Anda perlu mengimpor ke proyek Anda seperti yang dapat Anda lihat pada gambar di bawah ini. Phantomjs berada dalam kesamaan >> Library >> phantomjs.exe masukkan deskripsi gambar di sini

Sekarang yang Anda harus di dalam kode Selenium Anda adalah mengubah baris

browser = webdriver.Firefox()

Untuk sesuatu seperti

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

Path ke phantomjs mungkin berbeda ... ubah sesuka Anda :)

Itu dia, itu berhasil untuk saya. dan pasti dia akan bekerja untukmu, Cheers

Ayoub
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah
slfan
8

Di windows Anda dapat menggunakan win32gui:

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)

Contoh:

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

Namun ada satu masalah dengan solusi ini - menggunakan metode send_keys membuat jendela muncul. Anda dapat mengatasinya dengan menggunakan javascript yang tidak menampilkan jendela:

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

Saya menggunakan kode ini untuk Firefox di Windows dan mendapat jawaban: (referensi di sini )

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

Tapi saya tidak mengujinya untuk browser lain.

NaabNuts
sumber
Pertanyaan sudah dijawab dan penulis sudah menyetujui jawabannya.
Sariq Shaikh
4
Saya menjawab untuk orang lain yang akan melihat posting ini
NaabNuts
1
Terima kasih telah memberikan kami alternatif Firefox
TimDC
Selamat datang. Jika Anda memiliki pertanyaan tentang Selenium dan Django, saya akan menjawab Anda.
NaabNuts
Bekerja di chrome juga!
Heisenberg
3

Mungkin dalam opsi. Berikut adalah kode java yang identik.

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

Ini adalah solusi NodeJS sederhana yang bekerja di Selenium versi 4.x (mungkin juga 3.x).

Chrome:

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

Semuanya hanya berjalan di latar belakang. Tepat seperti yang kita inginkan.

ndsvw
sumber
1

Jika Anda menggunakan driver chrome, Anda dapat menggunakan kode yang sangat sederhana ini: (berfungsi untuk saya)

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
sumber
0

Pada * nix, Anda juga dapat menjalankan X-server tanpa kepala seperti Xvfb dan arahkan variabel DISPLAY ke sana:

Server X palsu untuk pengujian?

pengguna2645074
sumber
0

Berikut adalah solusi .net yang berfungsi untuk saya:

Unduh PhantomJs di sini http://phantomjs.org/download.html

Salin .exe dari folder nampan di unduh dan tempel di folder nampan debug / lepaskan proyek Visual Studio Anda.

Tambahkan ini menggunakan

using OpenQA.Selenium.PhantomJS;

Dalam kode Anda, buka driver seperti ini:

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

Jika Anda menggunakan Ubuntu (Gnome), satu solusi sederhana adalah menginstal Gnome extension auto-move-window: https://extensions.gnome.org/extension/16/auto-move-windows/

Kemudian atur browser (mis. Chrome) ke ruang kerja lain (mis. Workspace 2). Browser akan berjalan secara diam-diam di ruang kerja lain dan tidak mengganggu Anda lagi. Anda masih dapat menggunakan Chrome di ruang kerja Anda tanpa gangguan apa pun.

Bob
sumber
0

hai saya punya masalah yang sama dengan chromedriver saya menggunakan python dan options.add_argument ("tanpa kepala") tidak bekerja untuk saya tetapi kemudian saya menyadari bagaimana cara memperbaikinya sehingga saya membawanya dalam kode di bawah ini

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

Saya harap ini berhasil untuk Anda.

Soroush Bn
sumber
0

Salah satu cara untuk mencapai ini adalah dengan menjalankan browser dalam mode tanpa kepala. Keuntungan lain dari ini adalah bahwa tes dijalankan lebih cepat.

Silakan temukan kode di bawah ini untuk mengatur mode tanpa kepala di browser chrome.

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
sumber