Selenium으로 페이지가 로드될 때까지 기다리는 방법

How Wait Page Load With Selenium



Selenium 웹 드라이버를 사용하여 웹 자동화 또는 웹 스크래핑을 수행하는 동안 선택하려는 요소를 사용할 수 없거나 누르려는 버튼을 클릭할 준비가 되지 않는 등의 문제에 직면할 수 있습니다.

이 문제가 발생하는 이유는 Selenium 웹 드라이버가 웹 페이지를 다운로드하고 페이지 렌더링을 완료해야 페이지에서 작업을 수행할 수 있기 때문입니다. 과거에는 웹서버가 웹사이트의 콘텐츠를 생성했고, 브라우저는 그것을 다운로드하여 렌더링만 했습니다. 요즘에는 약간 다르게 작동하는 단일 페이지 웹 앱이 많이 있습니다. SPA(단일 페이지 웹 앱)에서 웹 서버는 프런트엔드 코드만 제공합니다. 프론트엔드 코드가 브라우저에서 렌더링되면 프론트엔드 코드는 AJAX를 사용하여 웹 서버에 API 데이터를 요청합니다. 프론트엔드가 API 데이터를 수신하면 브라우저에서 렌더링합니다. 따라서 브라우저가 웹 페이지 다운로드 및 렌더링을 완료했는데도 웹 페이지가 아직 준비되지 않은 상태입니다. API 데이터를 수신하고 렌더링할 때까지 기다려야 합니다. 따라서 이 문제에 대한 해결책은 Selenium으로 작업을 수행하기 전에 데이터를 사용할 수 있을 때까지 기다리는 것입니다.







Selenium에는 두 가지 유형의 대기가 있습니다.
1) 암시적 대기
2) 명시적 대기



1) 암시적 대기: 이것은 구현하기 가장 쉽습니다. 암시적 대기는 Selenium 웹 드라이버가 DOM(문서 개체 모델)이 준비(웹 페이지가 준비됨)될 때까지 몇 초 동안 기다리도록 지시합니다.



2) 명시적 대기: 이것은 암시적 대기보다 약간 복잡합니다. 명시적 대기에서는 Selenium 웹 드라이버에 무엇을 기다려야 하는지 알려줍니다. Selenium은 특정 조건이 충족될 때까지 기다립니다. 이것이 충족되면 Selenium 웹 드라이버는 다른 명령을 받을 준비가 됩니다. 일반적으로 명시적 대기 시간은 가변적입니다. 조건이 얼마나 빨리 충족되는지에 달려 있습니다. 최악의 시나리오에서 명시적 대기는 암시적 대기만큼 대기합니다.





이 기사에서는 Selenium으로 페이지가 로드될 때까지 (암시적 및 명시적) 기다리는 방법을 보여 드리겠습니다. 시작하겠습니다.

전제 조건:

이 문서의 명령과 예제를 시도하려면 다음이 필요합니다.



1) 컴퓨터에 설치된 Linux 배포판(우분투 권장).
2) 컴퓨터에 Python 3이 설치되어 있습니다.
3) 컴퓨터에 PIP 3가 설치되어 있습니다.
4) 파이썬 가상 환경 컴퓨터에 설치된 패키지.
5) 컴퓨터에 설치된 Mozilla Firefox 또는 Google Chrome 웹 브라우저.
6) Firefox Gecko Driver 또는 Chrome Web Driver를 설치하는 방법을 알고 있어야 합니다.

요구 사항 4, 5 및 6을 충족하려면 내 기사를 읽으십시오. Python 3을 사용한 Selenium 소개 Linuxhint.com에서

다른 주제에 대한 많은 기사를 찾을 수 있습니다. 리눅스힌트닷컴 . 도움이 필요한 경우 반드시 확인하십시오.

프로젝트 디렉토리 설정:

모든 것을 정리하려면 새 프로젝트 디렉토리를 만드세요. 셀레늄 대기/ 다음과 같이:

$mkdir -pv셀레늄 대기/운전사

다음으로 이동합니다. 셀레늄 대기/ 프로젝트 디렉토리는 다음과 같습니다.

$CD셀레늄 대기/

다음과 같이 프로젝트 디렉터리에 Python 가상 환경을 만듭니다.

$가상 환경

다음과 같이 가상 환경을 활성화합니다.

$원천.venv/오전/활성화

다음과 같이 PIP3를 사용하여 Selenium을 설치합니다.

$ pip3 셀레늄 설치

필요한 모든 웹 드라이버를 다운로드하여 설치하십시오. 드라이버/ 프로젝트의 디렉토리. 내 기사에서 웹 드라이버를 다운로드하고 설치하는 과정을 설명했습니다. Python 3을 사용한 Selenium 소개 . 도움이 필요하면 검색 리눅스힌트닷컴 그 기사를 위해.

이 기사의 데모를 위해 Google Chrome 웹 브라우저를 사용할 것입니다. 그래서, 나는 사용할 것입니다 크롬 드라이버 바이너리 드라이버/ 예배 규칙서.

암시적 대기를 실험하려면 새 Python 스크립트를 만드십시오. ex01.py 프로젝트 디렉토리에서 해당 파일에 다음 코드 줄을 입력합니다.

~에서셀렌수입웹드라이버
~에서셀렌.웹드라이버.흔한.열쇠 수입열쇠
옵션=웹드라이버.크롬옵션()
옵션.목이 없는 = 진실
브라우저=웹드라이버.크롬(실행 파일 경로='./드라이버/크롬드라이버',옵션=옵션)
브라우저.묵시적으로_기다림(10)
브라우저.가져 오기('https://www.unixtimestamp.com/')
타임스탬프=브라우저.find_element_by_xpath('//h3[@][1]')
인쇄('현재 타임스탬프: %s'%(타임스탬프.텍스트.나뉘다('')[0]))
브라우저.닫다()

완료되면 저장 ex01.py 파이썬 스크립트.

1행과 2행은 필요한 모든 Selenium 구성 요소를 가져옵니다.

4행은 Chrome 옵션 개체를 만듭니다.

5행은 Chrome 웹 드라이버에 대해 헤드리스 모드를 활성화합니다.

7행은 다음을 사용하여 Chrome 브라우저 개체를 만듭니다. 크롬 드라이버 바이너리 드라이버/ 예배 규칙서.

8행은 Selenium이 묵시적으로_wait() 브라우저 방법.

10행은 브라우저에서 www.unixtimestamp.com을 로드합니다.

12행은 XPath 선택기를 사용하여 타임스탬프 요소를 찾습니다. //h3[@class='텍스트 위험'][1] 에 저장하고 타임스탬프 변하기 쉬운.

Chrome 개발자 도구에서 XPath 선택기를 얻었습니다. 보시다시피 타임 스탬프는 첫 번째에 있습니다. h3 클래스 이름이 있는 요소 문자 위험 . 2개가 있다 h3 클래스가 있는 요소 문자 위험 .

13행은 XPath 선택기를 사용하여 선택한 요소의 타임스탬프만 인쇄하고 타임스탬프 변하기 쉬운.

14행은 브라우저를 닫습니다.

완료되면 Python 스크립트를 실행합니다. ex01.py 다음과 같이:

$ python3 ex01.파이

보시다시피 현재 타임스탬프는 unixtimestamp.com에서 추출되어 콘솔에 인쇄됩니다.

명시적 대기 작업:

명시적 대기를 실험하려면 새 Python 스크립트를 만드십시오. ex02.py 프로젝트 디렉토리에서 해당 파일에 다음 코드 줄을 입력합니다.

~에서셀렌수입웹드라이버
~에서셀렌.웹드라이버.흔한.열쇠 수입열쇠
~에서셀렌.웹드라이버.흔한.~에 의해 수입에 의해
~에서셀렌.웹드라이버.지원하다.양파 수입WebDriver대기
~에서셀렌.웹드라이버.지원하다 수입예상_조건
옵션=웹드라이버.크롬옵션()
옵션.목이 없는 = 진실
브라우저=웹드라이버.크롬(실행 파일 경로='./드라이버/크롬드라이버',옵션=옵션)
브라우저.가져 오기('https://www.unixtimestamp.com/')
노력하다:
타임스탬프=WebDriver대기(브라우저, 10).~까지(
예상_조건.존재함_요소_위치((에 의해.XPATH, '
//h3[@][1]'
))
)
인쇄('현재 타임스탬프: %s'%(타임스탬프.텍스트.나뉘다('')[0]))
마지막으로:
브라우저.닫다()

완료되면 저장 ex02.py 파이썬 스크립트.

1-5행은 Selenium 라이브러리에서 필요한 모든 구성 요소를 가져옵니다.

7행은 Chrome 옵션 개체를 만듭니다.

Line 8은 Chrome 웹 드라이버에 대해 헤드리스 모드를 활성화합니다.

10행은 다음을 사용하여 Chrome 브라우저 개체를 만듭니다. 크롬 드라이버 바이너리 드라이버/ 예배 규칙서.

12행은 브라우저에서 www.unixtimestamp.com을 로드합니다.

명시적 대기는 try-finally 블록에서 구현됩니다(14-20행).

15-17행은 다음을 사용합니다. WebDriverWait() 물체. 의 첫 번째 주장 WebDriverWait() 는 브라우저 개체이고 두 번째 인수는 조건을 충족하는 데 허용되는 최대 시간(최악 시나리오)이며 이 경우 10초입니다.

에서 까지() 블록, expected_conditions.presence_of_element_located() 메소드는 요소를 선택하기 전에 요소가 존재하는지 확인하는 데 사용됩니다. 여기, By.XPATH 말하는데 사용된다 존재함_요소_위치() 요소를 선택하기 위해 XPath 선택기를 사용한 방법입니다. XPath 선택기는 //h3[@class='텍스트 위험'][1] .

요소를 찾으면 해당 요소에 저장됩니다. 타임스탬프 변하기 쉬운.

18행은 선택한 요소의 타임스탬프만 인쇄합니다.

마지막으로 19-20행은 브라우저를 닫습니다.

완료되면 실행 ex02.py 다음과 같은 Python 스크립트:

$ python3 ex02.파이

보시다시피 unixtimestamp.com의 현재 타임스탬프가 콘솔에 인쇄됩니다.

명시적 대기에서 요소 선택:

이전 섹션에서 내가 사용한 By.XPATH XPath 선택기를 사용하여 요소를 선택합니다. ID, 태그 이름, CSS 클래스 이름, CSS 선택기 등을 사용하여 요소를 선택할 수도 있습니다.

지원되는 선택 방법은 다음과 같습니다.

By.XPATH – XPath 선택기를 사용하여 요소를 선택합니다.

작성자.CLASS_NAME – CSS 클래스 이름을 사용하여 요소를 선택합니다.

By.CSS_SELECTOR – CSS 선택기를 사용하여 요소를 선택합니다.

By.ID – ID로 요소 선택

이름으로 – 이름으로 요소를 선택합니다.

작성자:TAG_NAME – HTML 태그 이름으로 요소를 선택합니다.

작성자:LINK_TEXT – 링크 텍스트로 요소/요소 선택 에게 (앵커) HTML 태그.

작성자.PARTIAL_LINK_TEXT – 부분 링크 텍스트로 요소/요소 선택 에게 (앵커) HTML 태그.

이에 대한 자세한 내용은 다음을 방문하십시오. Python Selenium API 문서 페이지 .

명시적 대기의 예상 조건:

이전의 명시적 대기 예제에서 존재함_요소_위치() 의 방법 예상_조건 내가 찾고 있던 요소가 그것을 선택하기 전에 존재하는지 확인하기 위한 명시적 대기 조건으로.

다른 예상_조건 명시적 대기 조건으로 사용할 수 있습니다. 그 중 일부는 다음과 같습니다.

title_is(제목) – 페이지의 제목이 다음인지 확인합니다. 제목 .

title_contains(partial_title) - 페이지 제목에 제목의 일부가 포함되어 있는지 확인 부분 제목 .

가시성_of(요소) – 여부를 확인합니다. 요소 요소의 너비와 높이가 0보다 큰 페이지에서 볼 수 있습니다.

visible_of_element_located(로케이터) -

Presence_of_element_located(로케이터) – 요소가 위치했는지 확인하십시오( 토지 경계 설정자 ) 페이지에 있습니다. NS 토지 경계 설정자 의 튜플입니다 (선택자 기준), 명시적 대기 예제에서 보여주듯이.

존재의 모든_요소_위치() – 모든 요소가 다음과 일치하는지 확인합니다. 토지 경계 설정자 페이지에 있습니다. NS 토지 경계 설정자 이다 (기준, 선택자) 튜플.

text_to_be_present_in_element(로케이터, 텍스트) – 여부를 확인합니다. 텍스트 에 의해 위치한 요소에 존재합니다. 토지 경계 설정자 . NS 토지 경계 설정자 이다 (기준, 선택자) 튜플.

element_to_be_clickable(로케이터) – 해당 요소에 의해 위치한 요소가 있는지 확인합니다. 토지 경계 설정자 표시되고 클릭할 수 있습니다. NS 토지 경계 설정자 이다 (기준, 선택자) 튜플.

element_to_be_selected(로케이터) – 해당 요소에 의해 위치한 요소가 있는지 확인합니다. 토지 경계 설정자 선택됩니다. NS 토지 경계 설정자 이다 (기준, 선택자) 튜플.

alert_is_present() – 페이지에 경고 대화 상자가 표시될 것으로 예상합니다.

더 많다 예상_조건 사용할 수 있습니다. 이에 대한 자세한 내용은 다음을 방문하십시오. Python Selenium API 문서 페이지 .

결론:

이 기사에서는 Selenium의 암시적 및 명시적 대기에 대해 논의했습니다. 또한 암시적 및 명시적 대기로 작업하는 방법을 보여 주었습니다. Selenium은 대기 시간을 최대한 줄이려고 시도하므로 항상 Selenium 프로젝트에서 명시적 대기를 사용하려고 시도해야 합니다. 이렇게 하면 Selenium 프로젝트를 실행할 때마다 특정 시간(초) 동안 기다릴 필요가 없습니다. 명시적 대기는 많은 시간을 절약해야 합니다.

Selenium 대기에 대한 자세한 내용은 다음을 방문하십시오. 공식 Selenium Python Library는 문서 페이지를 기다립니다. .