셀레늄의 기다림, 해석하는 3가지 기다림 방법을 꼭 사용하세요

여기에 이미지 설명 삽입

많은 사람들이 묻습니다. 이 드롭다운 상자를 찾을 수 없습니다. 팝업 상자를 찾을 수 없습니다... 모든 종류의 위치를 ​​찾을 수 없습니다. 사실 대부분의 경우 두 가지 종류의 문제가 있습니다.

  • 틀이 있다
  • 아니 대기

모두가 알고 있듯이 코드 실행 속도의 순서는 무엇이며 브라우저 로딩 및 렌더링 속도의 순서는 무엇입니까? 신발을 신고 외출하지 않습니까? 범프맨 포인트 센터에는 알파카 10,000마리가 날아다니는데 왕따 형의 속도가 느리고 형이 더 이상 너랑 놀지 않겠다고 해서 예외를 던진다.

그림

그렇다면 범프맨의 느린 로딩 속도는 어떻게 해결해야 할까요? 방법은 단 하나, 그것은 기다리는 것입니다. 기다리는 것과 관련하여 기다리는 세 가지 다른 방법이 있습니다 . 블로거의 말을 하나씩 들어보겠습니다.

01 강제 대기

첫 번째이자 가장 간단하고 무례한 방법은 강제로 sleep(xx)을 기다리는 것입니다. Flash가 xx 시간 동안 기다리도록 강제합니다. Bumpman이 속도를 따라갈 수 있는지 또는 이미 미리 도착했는지에 관계없이 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초가 지나면 다음 코드를 계속 실행합니다.디버깅에 매우 유용합니다.때때로 기다릴 수 있습니다. 이 대기 방법을 항상 사용하는 것은 너무 경직되어 프로그램의 실행 속도에 심각한 영향을 미칩니다.

02 암시적 대기

두 번째 방법은 implicitly wait(implicitly_wait(xx))입니다. 암시적 대기의 의미는 다음과 같습니다. Flash와 Bump Man은 Flash가 어디로 가든 상관없이 Bump Man을 xx초 동안 기다리기로 합의했습니다. Nei가 오면 둘 중 그들은 즉시 괴물과 싸우기 시작했고 범프맨이 지정된 시간 내에 도착하지 않으면 플래시가 스스로 이동하고 자연스럽게 범프맨이 예외를 던질 때까지 기다립니다.

코드를 살펴보십시오.

# -*- 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나 다른 것들이 너무 느리기 때문에 아직 페이지가 완전히 완성될 때까지 기다려야 다음 단계를 실행할 수 있을 것 같아요. 원하는 요소가 나올 때까지 기다리세요. 다음은 어떻게 해야 하나요? 셀레늄 명시적 대기 대기에서 제공하는 다른 대기 방법에 따라 방법이 있습니다.

특별히 설명할 필요가 있는 것은 암시적 대기는 전체 드라이버 주기에서 작동하므로 한 번만 설정하면 됩니다.어떤 사람들은 암시적 대기를 수면으로 사용하는 것을 보았고 모든 곳에서 올 것입니다...

03 지배적인 기다림

세 번째 방법은 명시적 대기이며, 이 클래스의 until() 및 until_not() 메소드와 결합된 WebDriverWait는 판단 조건에 따라 유연하게 대기할 수 있습니다. 주요 의미는 프로그램이 xx초마다 확인하여 조건이 성립되면 다음 단계를 실행하고, 그렇지 않으면 설정된 최대 시간을 초과할 때까지 계속 기다린 다음 TimeoutException을 발생시킨다는 것입니다.

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

# -*- coding: utf-8 -*-



from selenium import webdriver

from selenium.webdriver.support.waitimport WebDriverWait

from selenium.webdriver.supportimport expected_conditions as EC

from selenium.webdriver.common.byimport 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 클래스와 expected_conditions 모듈을 사용합니다. 다음 블로거가 이 두 모듈을 자세히 살펴보도록 안내합니다.

웹드라이버기다려

대기 모듈의 WebDriverWait 클래스는 명시적 대기 클래스입니다. 먼저 해당 매개변수와 메서드를 살펴보겠습니다.

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

초기화

driver: 传入WebDriver实例,即我们上例中的driver

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

~까지

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

때까지

与until相反,until是当某元素出现或什么条件成立则继续执行,

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

위의 내용을 읽은 후 기본적으로 명확합니다.호출 방법은 다음과 같습니다.

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

여기서 특별한 주의가 필요한 것은 until 또는 until_not의 실행 가능한 메소드 메소드 매개변수입니다. 많은 사람들이 다음과 같이 WebElement 객체를 전달합니다.

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # 错误

이것은 잘못된 사용법입니다. 여기서 매개변수는 호출 가능해야 합니다. 즉, 객체에 call() 메서드가 있어야 하며, 그렇지 않으면 예외가 발생합니다.

TypeError: 'xxx' object is not callable

여기에서 selenium에서 제공하는 expected_conditions 모듈의 다양한 조건을 사용하거나 WebElement의 **is_displayed(), is_enabled(), is_selected()** 메서드를 사용하거나 자체 캡슐화 메서드를 사용할 수 있습니다. 셀레늄이 제공하는 조건을 살펴보십시오.

예상_조건

Expected_conditions는 판단에 사용할 수 있는 일련의 조건을 포함하는 셀레늄 모듈입니다.

selenium.webdriver.support.expected_conditions(模块)

다음 두 조건부 클래스는 제목을 확인하고 들어오는 매개 변수 제목이 driver.title과 같거나 포함되어 있는지 확인합니다.

title_is

title_contains

다음 두 조건은 요소가 표시되는지 여부를 확인합니다. 전달된 매개변수는 (By.ID, 'kw')와 같은 튜플 유형 로케이터입니다. 이름에서 알 수 있듯이 하나의 적격 요소가 로드되는 한 하나가 전달됩니다. other must be all 조건을 충족하는 모든 요소가 로드됩니다.

presence_of_element_located

presence_of_all_elements_located

다음 세 가지 조건은 요소가 표시되는지 여부를 확인합니다. 처음 두 개의 수신 매개변수는 튜플 유형의 로케이터이고 세 번째 수신 WebElement(첫 번째와 세 번째는 본질적으로 동일함)

visibility_of_element_located

invisibility_of_element_located

visibility_of

다음 두 가지 조건은 특정 텍스트가 요소에 나타나는지 여부를 결정하고, 하나는 요소의 텍스트를 결정하고, 다른 하나는 요소의 값을 결정합니다.

text_to_be_present_in_element

text_to_be_present_in_element_value

다음 조건은 프레임을 잘라낼 수 있는지 여부를 결정하고 로케이터 튜플 또는 위치 지정 메서드에 직접 전달할 수 있습니다: id, name, index 또는 WebElement

frame_to_be_available_and_switch_to_it

다음 조건에 따라 경고 표시 여부가 결정됩니다.

alert_is_present

다음 조건은 요소를 클릭할 수 있는지 여부를 결정하고 로케이터를 전달합니다.

element_to_be_clickable

다음 네 가지 조건에 따라 요소 선택 여부가 결정됩니다.

element_to_be_selected(传入WebElement对象)

element_located_to_be_selected(传入locator元组)

element_selection_state_to_be(传入WebElement对象以及状态,相等返回True,否则返回False)

element_located_selection_state_to_be(传入locator以及状态,相等返回True,否则返回False)

마지막 조건은 요소가 여전히 DOM에 있는지 여부를 결정하고 WebElement 개체를 전달하면 페이지가 새로 고쳐졌는지 여부를 결정할 수 있습니다.

staleness_of

위의 조건은 모두 17가지 조건이며, until과 until_not의 조합으로 많은 판단을 할 수 있으며, 직접 유연하게 패키징할 수 있다면 스크립트의 안정성이 크게 향상될 것입니다.

마지막으로: 아래의 전체 소프트웨어 테스트 비디오 자습서가 구성 및 업로드되었으며 필요한 친구가 직접 얻을 수 있습니다.【保100%免费】
여기에 이미지 설명 삽입

소프트웨어 테스트 인터뷰 문서

우리는 고임금 직업을 찾기 위해 공부해야합니다.다음 인터뷰 질문은 Ali, Tencent 및 Byte와 같은 1 급 인터넷 회사의 최신 인터뷰 자료이며 일부 Byte 보스는 권위있는 답변을 제공했습니다.이 세트 완료 인터뷰 자료 모두가 만족스러운 직업을 찾을 수 있다고 믿습니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/m0_67695717/article/details/132228933