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

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

112 голосов | спросил kevzettler 24 AMpWed, 24 Apr 2013 02:46:50 +040046Wednesday 2013, 02:46:50

8 ответов


0

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

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

и

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

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

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

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

ответил Arran 24 PMpWed, 24 Apr 2013 19:28:32 +040028Wednesday 2013, 19:28:32
0

Если вы используете веб-драйвер 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()
ответил Amistad 3 Maypm14 2014, 21:09:21
0

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

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

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

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
ответил Marlies 21 PMpFri, 21 Apr 2017 16:25:06 +030025Friday 2017, 16:25:06
0

Начиная с 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 больше не поддерживается!

ответил Anton Angelov 3 PMpTue, 03 Apr 2018 15:55:59 +030055Tuesday 2018, 15:55:59
0

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

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

ответил Gonzalo Sanchez cano 13 FebruaryEurope/MoscowbTue, 13 Feb 2018 23:36:39 +0300000000pmTue, 13 Feb 2018 23:36:39 +030018 2018, 23:36:39
0

В Windows вы можете использовать win32gui:

import win32gui
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, 6)
        win32gui.ShowWindow(self.hwnd, 0)

    def show(self):
        win32gui.ShowWindow(self.hwnd, 5)
        win32gui.ShowWindow(self.hwnd, 3)

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+"';")
ответил Piotr Dabkowski 2 +04002013-10-02T00:18:13+04:00312013bEurope/MoscowWed, 02 Oct 2013 00:18:13 +0400 2013, 00:18:13
0

В * nix вы также можете запустить безголовый X-сервер, такой как Xvfb, и указать для него переменную DISPLAY:

Поддельный X-сервер для тестирования?

ответил user2645074 18 12013vEurope/Moscow11bEurope/MoscowMon, 18 Nov 2013 18:25:18 +0400 2013, 18:25:18
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 
}
ответил Jack Fairfield 20 Jpm1000000pmFri, 20 Jan 2017 20:41:43 +030017 2017, 20:41:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132