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

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

Ответ 1

Существует несколько способов, но это не просто "установить значение конфигурации". Если вы не инвестируете в безмозглый браузер, который не соответствует всем требованиям, это немного взломает:

Как скрыть окно Firefox (Selenium WebDriver)?

и

Можно ли скрыть браузер в Selenium RC?

Вы можете "предположительно", передать некоторые параметры в Chrome, в частности: --no-startup-window

Обратите внимание, что для некоторых браузеров, особенно для IE, это повредит вашим тестам, чтобы они не работали в фокусе.

Вы также можете немного взломать AutoIT, чтобы скрыть окно после его открытия.

Ответ 2

Если вы используете веб-драйвер Selenium с Python, вы можете использовать PyVirtualDisplay, оболочку Python для Xvfb и Xephyr.

PyVirtualDisplay нуждается в Xvfb в качестве зависимости. На Ubuntu сначала установите Xvfb:

sudo apt-get install xvfb

затем установите PyVirtualDisplay из Pypi:

pip install pyvirtualdisplay

Пример Selenium script в 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()

Ответ 3

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

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

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

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

Ответ 4

Начиная с 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 headless достигает> на 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 headless достигает> на 30% лучшего времени, чем пользовательский интерфейс. Другой безголовый драйвер PhantomJS поставляет на 34,92% лучше, чем режим Chrome без наушников. Удивительно для меня, браузер Edge бьет их всех.

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

Ответ 5

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

Я покажу вам один пример в 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.

Ответ 6

Я предлагаю использовать 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 может быть другим... измените, как вам нравится:)

Что это, это сработало для меня. и определенно он будет работать для вас, Cheers

Ответ 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+"';")

Ответ 8

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

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

Ответ 10

Вот решение .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 
}

Ответ 11

options = Options()
options.headless = True
driver = webdriver.Chrome(driverPath, chrome_options=options)

Ответ 12

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

Затем установите браузер (например, Chrome) на другое рабочее пространство (например, рабочее пространство 2). Браузер будет тихо работать в другом рабочем пространстве и больше не беспокоить вас. Вы по-прежнему можете использовать Chrome в своем рабочем пространстве без перерыва.

Ответ 13

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

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

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

Ответ 14

Это простое решение NodeJS, которое работает в новой версии Sexium 4.x (возможно, также 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')

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