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

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



답변

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

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

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

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

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

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


답변

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


답변

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

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

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

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


답변

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

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

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 에서 이에 대한 정보를 조금 더 추가합니다.


답변

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는 더 이상 유지되지 않습니다!


답변

자세한 정보는 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의 경로는 다를 수 있습니다 … 원하는대로 변경하십시오 🙂

그게 다야, 그것은 나를 위해 일했다. 그리고 분명히 그는 당신을 위해 일할 것입니다, 건배


답변

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+"';")