나는 많은 테스트를 실행하는 셀레늄 테스트 스위트를 가지고 있으며 각각의 새로운 테스트에서 내가 열어 놓은 다른 창 위에 브라우저 창을 엽니 다. 로컬 환경에서 작업하는 동안 매우 부끄럽습니다. 셀레늄 또는 OS (MAC)에게 백그라운드에서 창을 열도록 지시하는 방법은 무엇입니까?
나는 많은 테스트를 실행하는 셀레늄 테스트 스위트를 가지고 있으며 각각의 새로운 테스트에서 내가 열어 놓은 다른 창 위에 브라우저 창을 엽니 다. 로컬 환경에서 작업하는 동안 매우 부끄럽습니다. 셀레늄 또는 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+"';")
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(...)
...
그러나 다른 브라우저에서는 테스트하지 않습니다.
이것은 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')
모든 것이 백그라운드에서 실행됩니다. 정확히 우리가 원하는 것.
크롬 드라이버를 사용하는 경우 다음과 같은 매우 간단한 코드를 사용할 수 있습니다.
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')
* nix에서 Xvfb와 같은 헤드리스 X 서버를 실행하고 DISPLAY 변수를 지정할 수도 있습니다.
나를 위해 일한 .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
}
Ubuntu (Gnome)를 사용하는 경우 간단한 해결 방법 중 하나는 Gnome 확장 자동 이동 창을 설치하는 것입니다. https://extensions.gnome.org/extension/16/auto-move-windows/
그런 다음 브라우저 (예 : Chrome)를 다른 작업 공간 (예 : 작업 공간 2)으로 설정하십시오. 브라우저는 다른 작업 공간에서 자동으로 실행되며 더 이상 방해하지 않습니다. 작업 공간에서 중단없이 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();
}
}
driver = webdriver.Firefox()
코드에서, 여기에 내 대답을 따르 stackoverflow.com/a/23898148/1515819을