>  기사  >  백엔드 개발  >  Python 셀레늄의 세 가지 대기 방법 해석

Python 셀레늄의 세 가지 대기 방법 해석

高洛峰
高洛峰원래의
2017-02-22 17:15:211127검색

기다리는 방법을 모르는 사람이 너무 많다는 걸 알았습니다. 블로거는 오늘 기다림의 필요성을 모든 사람에게 말하지 않을 수 없었습니다.

그룹에서 많은 분들이 이 드롭다운 상자를 찾을 수 없다고 문의하셨습니다. 저 팝업 상자를 찾을 수 없습니다... 다양한 유형의 상자를 찾을 수 없습니다. 실제로 대부분의 경우 거기에 있습니다. 두 가지 문제가 있습니다. 1. 기다리지 않고 프레임이 있습니다. 다들 아시다시피, 코드의 실행 속도는 몇 배이고, 브라우저의 로딩 및 렌더링 속도는 몇 배일까요? 마치 플래시와 알토맨이 몬스터와 싸우기로 약속을 하고 그 이후에 하는 것과 같습니다. 플래시가 싸움에서 돌아오자 알토 맨에게 왜 아직도 신발을 신고 밖에 나가지 않느냐고 물었습니다. 10,000 마리의 알파카가 게임 중앙을 날아 다닙니다. 느리다고 괴롭히며 더 이상 예외를 던지고 선택을 포기합니다.

그렇다면 알부민의 느린 로딩 속도를 어떻게 처리할 수 있을까요? 유일한 방법은 기다리는 것입니다. 기다리는 방법에는 세 가지가 있습니다. 블로거가 하나씩 설명해 드리겠습니다.

1. 강제로 기다리는 방법

가장 간단하고 조악한 방법입니다. 첫 번째 방법은 강제로 sleep(xx)을 기다리는 것입니다. 즉, Bumpman이 속도를 따라갈 수 있는지 또는 일찍 도착했는지에 관계없이 Flash가 xx 시간 동안 기다리도록 하는 것입니다.

코드를 보세요:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')

sleep(3) # 强制等待3秒再执行下一步

print driver.current_url
driver.quit()

이것을 강제 대기라고 합니다. 브라우저의 로딩이 완료되었는지 여부에 관계없이 프로그램은 기다려야 합니다. 3초 동안 3초가 지나면 다음 코드를 계속 실행합니다. 이는 디버깅에 매우 유용합니다. 때로는 코드에서 이렇게 기다릴 수 있지만 항상 이 대기 방법을 사용하는 것은 권장되지 않습니다. 프로그램의 실행 속도에 심각한 영향을 미칩니다.

2. 암시적 대기

두 번째 방법은 암시적 대기, implicitly_wait(xx)라는 의미입니다. Flash와 Bumpman이 동의했습니다. 알았어, 아니. 플래시가 어디로 가든지 범프맨을 기다려야 하며, 이 시간 내에 범프맨이 오면 두 사람은 즉시 몬스터들과 싸우러 출발합니다. 플래시 자신을 Go한 다음 자연스럽게 Aotuman이 예외를 던질 때까지 기다립니다.

코드 보기:

# -*- coding: utf-8 -*-
from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(30) # 隐性等待,最长等30秒
driver.get('https://huilansame.github.io')

print driver.current_url
driver.quit()

보이지 않는 대기는 지정된 시간 내에 웹 페이지가 로드되는 경우 최대 대기 시간을 설정하는 것입니다. , 다음 단계가 실행됩니다. 그렇지 않으면 시간이 만료될 때까지 기다렸다가 다음 단계를 실행합니다. 여기에는 단점이 있습니다. 즉, 프로그램은 전체 페이지가 로드될 때까지 기다립니다. 즉, 일반적으로 브라우저 탭 표시줄의 작은 원이 더 이상 회전하지 않는 것을 확인하면 다음 단계를 실행합니다. 하지만 때로는 페이지에 원하는 요소가 오랫동안 로드되었지만 일부 js 및 기타 작업이 매우 느리기 때문에 다음 단계를 수행하기 전에 페이지가 완전히 완료될 때까지 기다려야 합니다. 내가 원하는 요소가 나올 때까지 기다렸다가 어떻게 해야 하나요? 방법이 있습니다. 이는 Selenium에서 제공하는 또 다른 대기 방법(명시적 대기 대기)에 따라 다릅니다.

암시적 대기는 전체 드라이버 주기에 대해 작동하므로 한 번만 설정하면 됩니다. 암시적 대기를 절전 모드로 사용하는 경우는 잠시 동안만 사용할 수 있습니다. ...

3. 명시적 대기

세 번째 방법은 이 클래스의 Until() 및 Until_not() 메서드를 사용하여 명시적으로 기다리는 WebDriverWait입니다. 판단조건에 따라 탄력적으로 대기하실 수 있습니다. 주요 의미는 프로그램이 xx초마다 확인한다는 것입니다. 조건이 true이면 다음 단계를 실행합니다. 그렇지 않으면 설정된 최대 시간이 초과될 때까지 계속 기다린 후 TimeoutException이 발생합니다.

먼저 코드 예시를 살펴보겠습니다.

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.implicitly_wait(10) # 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
driver.get('https://huilansame.github.io')
locator = (By.LINK_TEXT, 'CSDN')

try:
  WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
  print driver.find_element_by_link_text('CSDN').get_attribute('href')
finally:
  driver.close()

위 예시에서는 암시적 대기와 명시적 대기 등을 설정했습니다. 암시적 대기는 결정적인 역할을 하고 명시적 대기는 WebDriverWait..에서 주요 역할을 합니다. 그러나 가장 긴 대기 시간은 둘 중 더 큰 것에 따라 다르다는 점에 유의해야 합니다. 이 예에서는 암시적 대기인 경우 20입니다. 대기 시간 > 명시적 대기 시간인 경우 코드의 최대 대기 시간은 암시적 대기 시간과 같습니다.

우리는 주로 WebDriverWait 클래스와 Expect_conditions 모듈을 사용합니다. 다음 블로거는 이 두 모듈을 자세히 살펴볼 것입니다:

WebDriverWait

wait 모듈 WebDriverWait 클래스는 명시적 대기 클래스입니다. 먼저 여기에 포함된 매개변수와 메서드를 살펴보겠습니다.

selenium.webdriver.support.wait.WebDriverWait(类)

__init__
  driver: 传入WebDriver实例,即我们上例中的driver
  timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
  poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
  ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,
      则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

until
  method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
  message: 如果超时,抛出TimeoutException,将message传入异常

until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,
    until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。
  method
  message

위 내용을 읽은 후에는 다음과 같습니다. 기본적으로 메소드를 다음과 같이 호출합니다.

WebDriverWait(driver, timeout 기간, 호출 빈도, 예외 무시).until(실행 가능한 메소드, 시간 초과 시 반환되는 정보)

필요한 것 여기서 특히 주의할 점은 Until 또는 Until_not의 실행 가능한 메서드 메서드 매개 변수를 사용하는 경우 많은 사람들이 다음과 같이 WebElement 개체를 전달한다는 것입니다.

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 오류

여기의 매개변수는 호출 가능해야 합니다. 즉, 이 객체에는 __call__() 메서드가 있어야 합니다. 그렇지 않으면 예외가 발생합니다.

TypeError: 'xxx' 객체를 호출할 수 없습니다

여기서 셀레늄에서 제공하는 Expect_conditions 모듈의 다양한 조건을 사용하거나 WebElement의 is_displayed(), is_enabled(), is_selected() 메서드를 사용할 수 있습니다. 직접 캡슐화하세요 모든 방법이 가능합니다. 그러면 셀레늄이 제공하는 조건을 살펴보겠습니다.

expected_conditions

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:

selenium.webdriver.support.expected_conditions(模块)

这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains

这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located

这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of

这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value

这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it

这个条件判断是否有alert出现
alert_is_present

这个条件判断元素是否可点击,传入locator
element_to_be_clickable

这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be

最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of

위의 조건은 모두 17개 조건으로, Until과 Until_not과 결합하여 자체적으로 유연하게 캡슐화할 수 있다면 스크립트의 안정성이 크게 향상됩니다.

오늘은 이 내용을 공유하겠습니다. 궁금한 점이 있으면 메시지를 남겨주세요. 도움이 필요한 학생들에게 도움이 되기를 바랍니다. 이 사이트를 지원해 주신 모든 분들께 감사드립니다!

파이썬 셀레늄의 세 가지 대기 방법 해석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.