프로그래밍/python

selenium 자동화 진행 중 특정 로딩화면이 사라질 때 까지 대기하는 함수

이휘재123 2023. 3. 23. 18:45
반응형
    # 공통 로딩화면
    def wait_loading(self):
        driver = self.driver
        # $x('//div[contains(@class, "blockUI")]')
        loading = True
        wait_count = 1
        self.maximum_wait = 60
        self.default_wait = 10
        driver.implicitly_wait(1)
        try:
            loading_screen = driver.find_element(By.XPATH, '//div[contains(@class, "blockUI")]')
        except Exception as e:
            print(f"loading finished")

        driver.implicitly_wait(1)
        while loading:
            try:
                print(f"wait_count: {wait_count}")
                loading_screen = driver.find_element(By.XPATH, '//div[contains(@class, "blockUI")]')
                wait_count = wait_count + 1
                loading = True
                if wait_count > self.maximum_wait:
                    loading = False
                    # raise UserWarning
                    raise UserWarning("무한 로딩")

            except UserWarning as ue:
                print(f"최대 대기시간 {self.maximum_wait}초 초과")
                # raise UserWarning
                raise UserWarning("무한 로딩")

            except Exception as e:
                print(f"로딩 완료")
                break

            finally:
                time.sleep(1)

        print(f"loading finished")
        driver.implicitly_wait(self.default_wait)

WebdriverWait과 EC의 기능만으로는 도무지 해결이 불가능한 로딩화면이 나타났을 때 사용하려고 제작했다.

 

무한 반복문을 돌면서 loading_screen이 있는지 검색해보고 없다면 종료되는 함수이다.

 

driver.implicitly_wait(1)을 적용해서 1초마다 해당 webelement를 검색하도록 설정하였고,

 

self.maximum_wait = 60으로 최대 대기시간을 설정해서 해당 시간이 되면 오류를 발생시키도록 하였다.

 

loading_screen 부분의 셀렉터만 잘 잡아주면 바로 사용 가능.

 

 

해당 코드의 경우에는 XPATH가 '//div[contains(@class, "blockUI")]' 인 로딩화면에 사용했다.

반응형