-
Python Selenium: 여러가지 팁컴퓨터/파이썬 2021. 6. 7. 16:25728x90반응형
1. 크롬 드라이버를 알아서 다운로드해서 설정
이유: 셀레니움을 이용한 콘솔 앱을 만들었는데 chrome이 업데이트된 후에 정상적으로 작동하지 않음
webdriver-manager를 이용해서 알아서 다운로드 시킨다.
(크롬, firefox, IE, edge를 지원함)
pip install webdriver-manager
예제
import os import sys from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager def resource_path(another_way): try: usual_way = ( sys._MEIPASS # type: ignore ) # When in .exe, this code is executed, that enters temporary directory that is created automatically during runtime. except Exception: usual_way = os.path.dirname( __file__ ) # When the code in run from python console, it runs through this exception. return os.path.join(usual_way, another_way) class BlackBoard: def __init__(self, options): print("[1/3] logging 1...") dr = Service(resource_path(ChromeDriverManager(cache_valid_range=1).install())) driver = webdriver.Chrome( service=dr, options=options, ) self.driver.implicitly_wait(5)
2. exe로 만들 때 chromedriver.exe 내장하기
(exe를 포함해서 패킹하던가 1번 방식으로 해도 정상 작동)
exe를 실행하면 temp 폴더에 있는 내장된 chromedriver가 풀어진다.
resource_path 함수를 보면 _MEIPASS를 이용해서 경로를 변경시켜준다.
예제
import os import sys from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager def resource_path(another_way): try: usual_way = ( sys._MEIPASS # type: ignore ) # When in .exe, this code is executed, that enters temporary directory that is created automatically during runtime. except Exception: usual_way = os.path.dirname( __file__ ) # When the code in run from python console, it runs through this exception. return os.path.join(usual_way, another_way) class BlackBoard: def __init__(self, options): print("[1/3] logging 1...") self.driver = webdriver.Chrome(resource_path("./chrome89.exe"), options=options) self.driver.implicitly_wait(5)
3. 모든 logging 끄기
DevTools listening on ws://127.0.0.1 과 같은 로깅을 끄는 것은 다음과 같다.
예제
chrome 기준
if __name__ == "__main__": __version__ = "1.0.0" os.system(f"title console 앱 창 이름 v{__version__}") # 윈도우에서 창 이름 바꾸기 os.system(f'/bin/bash -c \"echo -ne \'\033]0;console 앱 창 이름 v{__version__}\007\'\"') # 리눅스에서 창 이름 바꾸기 # 아래 크롬 옵션들 options = Options() options.add_experimental_option( "excludeSwitches", ["enable-logging"] ) # Dev listening on... options.add_argument("--log-level=3") options.add_argument("--headless") options.add_argument( "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" ) bb = BlackBoard(options) bb.getNotices()
4. exe로 패킹 후 cmd 끄는 동작 catch 하기
동작 중에 cmd를 꺼버리면 드라이버 프로세스가 살아있다. 그래서 win32api를 설치해서
cmd 창을 닫는 event를 catch 해준다. (win32api.SetConsoleCtrlHandler(함수 이름, True))
catch 시 실행되는 함수는 return True를 해준다.
pip install pywin32
예제
Windows 기준
import win32api class BlackBoard: def __init__(self, options): print("[1/3] logging 1...") self.driver = webdriver.Chrome( resource_path( ChromeDriverManager( log_level=0, cache_valid_range=1, print_first_line=False ).install() ), options=options, ) self.driver.implicitly_wait(5) def exit(self): # print("\n종료 중...") self.driver.close() self.driver.quit() return True if __name__ == "__main__": options = Options() options.add_experimental_option( "excludeSwitches", ["enable-logging"] ) # Dev listening on... options.add_argument("--log-level=3") options.add_argument("--headless") options.add_argument( "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" ) bb = BlackBoard(options) # windows에서 콘솔 앱 종료 버튼 누를 때 catch win32api.SetConsoleCtrlHandler(bb.exit, True) bb.getNotices()
5. linux에서 콘솔 PAUSE
Windows에서 pause랑 비슷하다.
Press [Enter] to finish가 뜨고 아무 키나 입력하면 콘솔에 출력없이 넘어간다. (-s 옵션)
-n 1 key를 지우면 Enter 키만 받는다.
os.system('/bin/bash -c \"read -sp \'Press [Enter] to finish\n\' -n 1 key\"')
참고
아래 예제 BlackBoard Selenium 앱을 참고하면 된다.
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
FastAPI + discord.py snippet (0) 2021.08.24 Pyston: Python 3.8.8 최적화 버전 (0) 2021.05.09 Python: Generic 함수 만들기 (functools.singledispatch) (0) 2021.04.07