Selenium Webdriver가 백그라운드에서 자동으로 브라우저 창을 열 수 있습니까?


161

나는 많은 테스트를 실행하는 셀레늄 테스트 스위트를 가지고 있으며 각각의 새로운 테스트에서 내가 열어 놓은 다른 창 위에 브라우저 창을 엽니 다. 로컬 환경에서 작업하는 동안 매우 부끄럽습니다. 셀레늄 또는 OS (MAC)에게 백그라운드에서 창을 열도록 지시하는 방법은 무엇입니까?


당신이 수행하는 경우 driver = webdriver.Firefox() 코드에서, 여기에 내 대답을 따르 stackoverflow.com/a/23898148/1515819을
스테판 Bruckert

@ StéphaneBruckert Chrome과 같은 것이 있습니까?
E.Praneeth 's

stackoverflow.com/a/48775203/1207193 은 작동 솔루션입니다 2020 GoogleChrome Windows
eusoubrasileiro

답변:


64

몇 가지 방법이 있지만 간단한 "구성 값 설정"은 아닙니다. 모든 사람의 요구 사항에 맞지 않는 헤드리스 브라우저에 투자하지 않는 한 약간의 해킹입니다.

Firefox 창을 숨기는 방법 (Selenium WebDriver)?

Selenium RC에서 브라우저를 숨길 수 있습니까?

``추정 적으로 '', 일부 매개 변수를 Chrome에 전달할 수 있습니다. --no-startup-window

일부 브라우저, 특히 IE의 경우 초점이 맞지 않으면 테스트가 손상됩니다.

AutoIT로 조금 해킹하여 창이 열리면 창을 숨길 수도 있습니다.


8
"--no-시작 창은"이제 더 이상 사용되지 않습니다
코리 골드버그

2
실제로 사용하는 대신 "--no-시작 창"의 "--headless는"나는 맥과 크롬 V80에서 작동 확인했습니다
Loaderon

178

Python과 함께 Selenium 웹 드라이버를 사용하는 경우 Xvfb 및 Xephyr 용 Python 래퍼 인 PyVirtualDisplay를 사용할 수 있습니다.

PyVirtualDisplay는 Xvfb를 종속성으로 필요로합니다. 우분투에서 먼저 Xvfb를 설치하십시오 :

sudo apt-get install xvfb

그런 다음 Pypi에서 PyVirtualDisplay를 설치하십시오.

pip install pyvirtualdisplay

PyVirtualDisplay를 사용하여 헤드리스 모드에서 Python의 샘플 Selenium 스크립트 :

    #!/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에는 이제 완전히 헤드리스 버전이 있으므로 타사 라이브러리를 사용하여 UI 창을 숨길 필요가 없습니다. 샘플 코드는 다음과 같습니다.

    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
Eldamir

9
Mac OSX에서도 사용할 수 있습니까?
vanguard69

당신이 우분투를 사용하는 경우이 크고 테스트 스위트는 파이썬에
kevzettler


1
chrome_options의 사용은 더 이상 사용되지 않습니다. 이제는 옵션
일뿐입니다.

40

Chrome 57에는 --headless 플래그를 전달하여 창이 보이지 않게하는 옵션이 있습니다.

마지막 플래그가 창을 시작하지 않으므로이 플래그는 --no-startup-window와 다릅니다. 이 페이지에서 말하는 것처럼 백그라운드 앱을 호스팅하는 데 사용됩니다 .

플래그를 Selenium 웹 드라이버 (ChromeDriver)에 전달하는 Java 코드 :

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

VBA 언어로 동일한 작업을 수행 할 수 있는지 알고 있습니까?
Martin

나는 당신의 문제가 이미 해결 여부,하지만 빠른 검색 후 나는 그 발견되었는지 여부를 모르는 @Martin : github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/...는 이 작업을 수행 도와 줄까?
Marlies

19

브라우저없이 실행하려면 헤드리스 모드 에서 실행할 수 있습니다 .

나는 지금 당신을 위해 일하고있는 파이썬의 한 가지 예를 보여줍니다.

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 년 6 월 기준으로 매우 원활하게 작업
Jonny Boy

15

Chrome 57부터 헤드리스 논쟁이 있습니다.

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

Chrome의 헤드리스 모드는 UI 버전보다 30.97 % 더 우수합니다. 다른 헤드리스 드라이버 인 PhantomJS는 Chrome의 헤드리스 모드보다 34.92 % 더 우수합니다.

팬텀 JSDriver

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

Mozilla Firefox의 헤드리스 모드는 UI 버전보다 3.68 % 더 좋습니다. Chrome의 헤드리스 모드가 UI보다 30 % 더 나은 시간을 달성하기 때문에 실망합니다. 다른 헤드리스 드라이버 인 PhantomJS는 Chrome의 헤드리스 모드보다 34.92 % 더 우수합니다. 놀랍게도 Edge 브라우저는 모든 것을 능가합니다.

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

Firefox 57 이상에서 사용할 수 있습니다

Mozilla Firefox의 헤드리스 모드는 UI 버전보다 3.68 % 더 좋습니다. Chrome의 헤드리스 모드가 UI보다 30 % 더 나은 시간을 달성하기 때문에 실망합니다. 다른 헤드리스 드라이버 인 PhantomJS는 Chrome의 헤드리스 모드보다 34.92 % 더 우수합니다. 놀랍게도 Edge 브라우저는 모든 것을 능가합니다.

참고 : PhantomJS는 더 이상 유지되지 않습니다!


8

자세한 정보는 Phantom Js를 사용하여 Phantom Official Website 를 방문하십시오.

내가 아는 한 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 메소드를 사용하면 창이 표시됩니다. 창을 표시하지 않는 자바 스크립트를 사용하여 처리 할 수 ​​있습니다.

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

5

Windows에서 Firefox 에이 코드를 사용하고 답변을 얻었습니다. (reference here )

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

그러나 다른 브라우저에서는 테스트하지 않습니다.


질문은 이미 답변되었으며 저자는 이미 답변을 승인했습니다.
Sariq Shaikh

4
나는이 포스트를 보게 될 다른 사람들을 위해 대답했다
NaabNuts

1
Firefox 대안을 제공해 주셔서 감사합니다
TimDC

셀레늄과 장고에 대해 궁금한 점이 있으면 답변 해 드리겠습니다.
NaabNuts

크롬에서도 작동합니다!
Heisenberg

3

옵션에있을 수 있습니다. 다음은 동일한 Java 코드입니다.

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

1

이것은 Selenium의 새 버전 4.x (또는 3.x)에서 작동하는 간단한 NodeJS 솔루션입니다.

크롬:

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

다운로드의 bin 폴더에서 .exe를 복사하여 Visual Studio 프로젝트의 bin 디버그 / 릴리스 폴더에 붙여 넣습니다.

이것을 사용하여 추가하십시오

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

안녕, 나는 파이썬과 옵션을 사용하여 내 크롬 드라이버와 같은 문제가 있었다. add_argument ( "headless") 나를 위해 작동하지 않았지만 그것을 수정하는 방법을 깨달았으므로 아래 코드로 가져 오십시오.

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();
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.