ABOUT ME

-

Total
-
  • Python Selenium: 여러가지 팁
    컴퓨터/파이썬 2021. 6. 7. 16:25
    728x90
    반응형

    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 앱을 참고하면 된다.

     

    Alfex4936/Ajou-BlackBoard

    아주대학교 블랙보드(BB) 셀레니움을 이용한 예제. Contribute to Alfex4936/Ajou-BlackBoard development by creating an account on GitHub.

    github.com

     

    728x90

    댓글