Может ли Selenium Webdriver тихо открывать окна браузера в фоновом режиме?

162

У меня есть набор тестов селена, который запускает много тестов, и при каждом новом тесте он открывает окно браузера поверх любых других открытых мной окон. Очень резкий, работая в местной среде. Любой способ сказать селен или ОС (MAC), чтобы открыть окна в фоновом режиме?

kevzettler
источник
Если вы делаете driver = webdriver.Firefox() в своем коде, следуйте моему ответу здесь: stackoverflow.com/a/23898148/1515819
Стефан Брукерт
@ 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» устарело
Кори Голдберг
2
действительно, используйте «--headless» вместо «--no-startup-window», я подтвердил, что он работает на 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()

РЕДАКТИРОВАТЬ Первоначальный ответ был опубликован в 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
Посмотри это. stackoverflow.com/questions/944086/…
Амистад
1
использование chrome_options устарело, теперь это просто параметры
Моджими
40

В Chrome 57 есть возможность передать флаг --headless, что делает окно невидимым.

Этот флаг отличается от --no-startup-window, поскольку последний не запускает окно. Он используется для размещения фоновых приложений, как сказано на этой странице .

Java-код для передачи флага веб-драйверу Selenium (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
источник
Знаете ли вы, можно ли сделать то же самое на языке 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 года
Джонни Бой
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% лучше, чем в версии пользовательского интерфейса. Это разочарование, поскольку режим без головы в 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% лучше, чем в версии пользовательского интерфейса. Это разочарование, поскольку режим без головы в Chrome обеспечивает> 30% лучшее время, чем в пользовательском интерфейсе. Другой безголовый драйвер PhantomJS работает на 34,92% лучше, чем безголовый режим Chrome. Удивительно для меня, браузер Edge превосходит их всех.

Примечание: PhantomJS больше не поддерживается!

Антон Ангелов
источник
8

Я предлагаю использовать Phantom Js для получения дополнительной информации, вам нужно посетить официальный сайт Phantom

Насколько я знаю, PhantomJS работает только с Firefox ..

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

Теперь все, что вам нужно внутри вашего кода Selenium, это изменить строку

browser = webdriver.Firefox()

Что-то вроде

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

Путь к фантомам может быть другим ... меняй как хочешь :)

Вот и все, это сработало для меня. и, безусловно, он будет работать для вас, ура

Аюб
источник
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы,
содержащие
8

На окнах вы можете использовать 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(...)
...

Но я не проверяю это для других браузеров.

NaabNuts
источник
На вопрос уже дан ответ, и автор уже одобрил ответ.
Сарик Шейх
4
Я отвечал за других людей, которые увидят этот пост
NaabNuts
1
Спасибо за предоставленную нам альтернативу Firefox
TimDC
Добро пожаловать. Если у вас есть какие-либо вопросы о Selenium и Django, я отвечу вам.
NaabNuts
Работает в Chrome тоже!
Гейзенберг
3

Это может быть в настройках. Вот идентичный код Java.

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
rinjan
источник
1

Это простое решение NodeJS, которое работает в новой версии Sexium 4.x (возможно, также 3.x).

Хром:

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

Fire Fox:

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

Все это просто работает в фоновом режиме. Именно то, что мы хотим.

ndsvw
источник
1

Если вы используете драйвер Chrome, вы можете использовать этот очень простой код: (он работал для меня)

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 debug / release вашего проекта 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

Привет у меня была такая же проблема с моим chromedriver с использованием python и options.add_argument ("headless") не работал для меня, но потом я понял, как это исправить, поэтому я привел его в код ниже

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

Я надеюсь, что это работает для вас.

Soroush Bn
источник
0

Один из способов добиться этого - запустить браузер в автономном режиме. Еще одним преимуществом этого является то, что тесты выполняются быстрее.

Пожалуйста, найдите код ниже, чтобы установить безголовый режим в браузере 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();
        }
    }
Навприт Сингх
источник