Чи може Selenium Webdriver мовчки відкривати вікна браузера у фоновому режимі?


161

У мене є тестовий набір селену, який виконує багато тестів, і при кожному новому тесті він відкриває вікно браузера поверх будь-яких інших вікон, які у мене є відкритими. Дуже дрімаючи під час роботи в місцевих умовах. Будь-який спосіб сказати селену чи ОС (MAC), щоб відкрити вікна у фоновому режимі?


Якщо ви робите driver = webdriver.Firefox() у вашому коді, слідувати моєму відповіді тут: stackoverflow.com/a/23898148/1515819
Stéphane Брукерт

@ StéphaneBruckert Чи є щось подібне для Chrome?
Е. Пранієт

stackoverflow.com/a/48775203/1207193 - це робоче рішення 2020 року GoogleChrome Windows
eusoubrasileiro

Відповіді:


64

Є кілька способів, але це не просто "встановлення значення конфігурації". Якщо ви не інвестуєте в безголівковий браузер, який не відповідає всім вимогам, це трохи зламати:

Як приховати вікно Firefox (Selenium WebDriver)?

і

Чи можливо сховати браузер у Selenium RC?

Ви можете "нібито" передати деякі параметри в Chrome, зокрема: --no-startup-window

Зауважте, що для деяких браузерів, особливо IE, це зашкодить вашим тестам, якщо він не запускатиметься у фокусі.

Ви також можете трохи зламати за допомогою AutoIT, щоб приховати вікно після його відкриття.


8
"--no-startup-window" тепер застаріло
Corey Goldberg

2
Дійсно, використовуйте "- без голови" замість "- не-запуску вікна", я підтвердив, що він працює на Mac і Chrome v80
Loaderon

178

Якщо ви використовуєте веб-драйвер Selenium з Python, ви можете використовувати PyVirtualDisplay, обгортку Python для Xvfb та Xephyr.

PyVirtualDisplay потребує Xvfb як залежності. На Ubuntu спочатку встановіть Xvfb:

sudo apt-get install xvfb

потім встановіть PyVirtualDisplay від Pypi:

pip install pyvirtualdisplay

Зразок сценарію Selenium в Python в безголовому режимі з 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 Початкова відповідь була опублікована у 2014 році, і тепер ми вже на самому початку 2018 року. Як і все, браузери також просунулися. Зараз у Chrome є повністю безголова версія, яка виключає необхідність використання будь-яких сторонніх бібліотек для приховування вікна інтерфейсу користувача. Зразок коду такий:

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

Прекрасне, чисте рішення. Дякую за це. Працює як шарм. Заслуговувало більше + 1с
Елдамір

9
Чи він доступний для Mac OSX?
vanguard69

Це чудово, якщо ви використовуєте Ubuntu і ваш тестовий набір знаходиться в Python
kevzettler


1
використання chrome_options застаріле, тепер лише параметри
Мохімі

40

У Chrome 57 є можливість пропустити прапор без голови, що робить вікно невидимим.

Цей прапор відрізняється від --no-startup-window, оскільки останній не запускає вікно. Він використовується для розміщення фонових додатків, як йдеться на цій сторінці .

Код Java для передачі прапора веб-дискам Selenium (ChromeDriver):

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

Чи знаєте ви, чи можна те ж саме зробити мовою VBA?
Мартін

@Martin Я не знаю , є чи ваша проблема вже була вирішена чи ні, але після швидкого пошуку я знайшов тих , хто: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955 / ... Чи це допомогти тобі?
Marlies

19

Для роботи без будь-якого браузера ви можете запускати його в режимі без голови .

Я показую вам один приклад в Python, який зараз працює на мене

from selenium import webdriver


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

Я також додаю вам трохи більше інформації про це на офіційному веб-сайті Google https://developers.google.com/web/updates/2017/04/headless-chrome


Найпростіша відповідь з усіх!
MarcioPorto

працював дуже гладко станом на червень 2020 року
Jonny Boy

15

З Chrome 57 у вас є безголовий аргумент:

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

Безшумний режим Chrome працює на 30,97% краще, ніж версія інтерфейсу користувача. Інший безголовий драйвер PhantomJS забезпечує на 34,92% краще, ніж у режимі без голови без Chrome.

PhantomJSDriver

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

Безголовий режим Mozilla Firefox працює на 3,68% краще, ніж версія UI. Це розчарування, оскільки безрукий режим Chrome досягає> 30% кращого часу, ніж інтерфейс користувача. Інший безголовий драйвер PhantomJS забезпечує на 34,92% краще, ніж у режимі без голови без Chrome. Дивно, але для мене браузер Edge перемагає всіх.

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

Це доступно у Firefox 57+

Безголовий режим Mozilla Firefox працює на 3,68% краще, ніж версія UI. Це розчарування, оскільки безрукий режим Chrome досягає> 30% кращого часу, ніж інтерфейс користувача. Інший безголовий драйвер PhantomJS забезпечує на 34,92% краще, ніж у режимі без голови без Chrome. Дивно, але для мене браузер Edge перемагає всіх.

Примітка: PhantomJS вже не підтримується!


8

Я пропоную використовувати Phantom Js для отримання додаткової інформації, яка вам потрібна для відвідування офіційного веб-сайту Phantom

Наскільки я знаю, PhantomJS працює лише з Firefox ..

після завантаження PhantomJs.exe вам потрібно імпортувати до свого проекту, як ви бачите на малюнку нижче. Phantomjs знаходиться всередині загального >> Бібліотека >> phantomjs.exe введіть тут опис зображення

Тепер все, що вам потрібно всередині вашого коду Selenium, - це змінити рядок

browser = webdriver.Firefox()

На щось подібне

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

Шлях до phantomjs може бути різним ... змінюйтеся, як вам подобається :)

Це все, це працювало на мене. і, безумовно, він буде працювати для вас, ура


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться
slfan

7

У Windows можна використовувати 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)

Приклад:

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

Однак є одна проблема з цим рішенням - використання методу send_keys змушує відобразити вікно. Ви можете вирішити це за допомогою javascript, який не показує вікно:

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

5

Я використовував цей код для Firefox у Windows і отримав відповідь: (посилання тут )

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

Але я не перевіряю це на інших браузерах.


На запитання вже відповіли, а автор вже схвалив відповідь.
Сарік Шайх

4
Я відповів за інших людей, які побачать цю публікацію
NaabNuts

1
Дякуємо, що надали нам альтернативу Firefox
TimDC

Якщо у вас виникнуть запитання щодо Селену та Джанго, я вам відповім.
NaabNuts

Працює і в хромі!
Гейзенберг

3

Це може бути у варіантах. Ось ідентичний код Java.

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

1

Це просте рішення NodeJS, яке працює в новій версії 4.x (можливо, також 3.x) Selenium.

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

Вся справа просто працює на задньому плані. Саме те, що ми хочемо.


1

Якщо ви використовуєте драйвер хрому, ви можете використовувати цей дуже простий код: (він працював для мене)

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

Ось .net рішення, яке працювало для мене:

Завантажте PhantomJs тут http://phantomjs.org/download.html

Скопіюйте .exe з папки bin у програмі завантаження та вставте у папку налагодження / випуск bin вашого проекту Visual Studio.

Додайте це за допомогою

using OpenQA.Selenium.PhantomJS;

У своєму коді відкрийте драйвер так:

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

0

Якщо ви використовуєте Ubuntu (Gnome), одним простим рішенням є встановлення автоматичного переміщення вікна розширення Gnome: https://extensions.gnome.org/extension/16/auto-move-windows/

Потім встановіть браузер (наприклад, Chrome) на іншу робочу область (наприклад, робочу область 2). Веб-переглядач мовчки працюватиме в іншій робочій області і більше не турбуватиме вас. Ви все ще можете використовувати Chrome у робочій області без будь-яких перерв.


0

привіт, у мене була така ж проблема з моїм хромедрівером за допомогою python та options.add_argument ("безголовий") для мене не працював, але тоді я зрозумів, як це виправити, тому я приношу його в код нижче

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

Я сподіваюся, що це працює для вас.


0

Один із способів досягти цього - запустити браузер у безголовому режимі. Ще одна перевага цього - тести виконуються швидше.

Знайдіть код нижче, щоб встановити безголовий режим у хромованому браузері.

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();
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.