python 3+selenium 4 창 과 iframe 을 전환 하 는 방법

자동화 테스트 과정 에서 가끔 후에 요소 의 포 지 셔 닝 방식 에 문제 가 없 지만 요 소 를 찾 을 수 없 는 이상 한 문 제 를 던 집 니 다.일반적인 상황 에서 요소 의 포 지 셔 닝 에 문제 가 없 지만 요 소 를 찾 지 못 하면 현재 초점 이 지정 한 페이지 나 iframe 에 없 기 때문에 다음 과 같은 두 가지 상황 에 대해 각각 설명 할 것 입 니 다.
1.창 전환
예 를 들 어 우 리 는 지금 이러한 수요 가 있 습 니 다.바 이 두 홈 페이지 에 들 어간 후에 뉴스 를 클릭 한 다음 에 뉴스 페이지 의 검색 상자 에 selenium 을 입력 합 니 다.
在这里插入图片描述
在这里插入图片描述
selenium 을 사용 하면 어떻게 실현 해 야 합 니까?selenium 에 대해 잘 모 르 는 상황 에서 이전의 내용 만 배 웠 을 뿐 쓴 코드 는 스티커 를 찾 을 수 없 을 수도 있 습 니 다.입력 상자 의 요 소 를 이상 하 게 검색 할 수 있 습 니 다.예제 코드 는 다음 과 같 습 니 다.

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '  ').click()   #     
driver.find_element(By.ID, 'ww').send_keys('selenium')  #           selenium
driver.quit()
코드 에 문제 가 없어 보 입 니 다.바 이 두 홈 페이지 를 열 고 스티커 를 클릭 한 다음 에 스티커 로그 인 페이지 에서 바로 등록 을 클릭 하면 요소 의 포 지 셔 닝 도 틀 리 지 않 습 니 다.하지만 실행 하면 이상 이 생 겨 서 스티커 의 입력 상자 요 소 를 찾 을 수 없습니다.
在这里插入图片描述
이 오류 가 발생 한 이 유 는 뉴스 를 클릭 한 후에 새로운 창 을 열 었 기 때 문 입 니 다.이때 열 린 창 은 바 이 두 홈 페이지 와 뉴스 페이지 가 있 고 selenium 은 우리 가 창 을 전환 할 필요 가 있 는 지 모 르 기 때문에 자동 으로 창 을 전환 시 키 지 않 고 수 동 으로 창 을 전환 해 야 합 니 다.
창 전환 을 실현 하려 면 브 라 우 저 핸들 과 창 전환 을 가 져 오 는 방법 이 필요 합 니 다.
1.1 핸들 가 져 오기
핸들 은 현재 브 라 우 저 창 이나 옵션 카드 의 id 와 같은 유일한 표지 입 니 다.현재 창 이나 옵션 카드 가 지정 한 창 에 있 는 지 판단 할 수 있 습 니 다.핸들 을 가 져 오 는 방법 은 다음 과 같 습 니 다.

        
driver.current_window_handle

             ,           
driver.window_handles
일반적으로 현재 창 핸들 을 사용 하여 모든 창 핸들 목록 과 비교 한 다음 창 전환 방법 을 사용 하면 창 전환 을 완료 할 수 있 습 니 다.
1.2.창 전환
창 전환 을 완료 하려 면 사용 방법 switchto.window(),뉴스 페이지 에 selenium 작업 이 완료 되 었 습 니 다.성공 적 인 예제 코드 는 다음 과 같 습 니 다.

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '  ').click()   #     

handle = driver.current_window_handle  #         
handles = driver.window_handles   #         
for window_handle in handles:   #       
    if window_handle != handle:   #                 ,       
        driver.switch_to.window(window_handle)

driver.find_element(By.ID, 'ww').send_keys('selenium')  #           selenium
time.sleep(2)
driver.quit()
상기 코드 는 두 창의 전환 에 만 적 용 됩 니 다.만약 에 더 많은 창 을 동시에 열 면 상기 코드 를 사용 하여 목록 의 마지막 비 현재 창 으로 만 전환 할 수 있 습 니 다.여러 창 이 존재 할 때 지정 한 창 으로 어떻게 정확하게 전환 해 야 합 니까?사실은 한 층 의 판단 만 추가 하면 됩 니 다.예 는 다음 과 같 습 니 다.

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '  ').click()   #     

handle = driver.current_window_handle  #         
handles = driver.window_handles   #         
for window_handle in handles:   #       
    if window_handle != handle:   #                 ,       
        driver.switch_to.window(window_handle)
        if driver.title == '    ――        ':     #          title      ,    
            break

driver.find_element(By.ID, 'ww').send_keys('selenium')  #           selenium
time.sleep(2)
driver.quit()
위 코드 에는 전환 후 창 title 이 예상 과 일치 하 는 지 판단 하 는 층 이 추가 되 어 있 습 니 다.일치 하면 여러 창 으로 전환 할 때 원 하 는 창 으로 정확하게 전환 할 수 있 도록 순환 을 뛰 어 내 려 전환 을 중단 합 니 다.
1.3.창 을 닫 고 원래 창 으로 전환
지정 한 창 으로 전환 하여 테스트 를 마 친 후 이 창 을 닫 고 원래 창 으로 전환 해 야 한다 면 예제 코드 는 다음 과 같 습 니 다.

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '  ').click()   #     

handle = driver.current_window_handle  #         
handles = driver.window_handles   #         
for window_handle in handles:   #       
    if window_handle != handle:   #                 ,       
        driver.switch_to.window(window_handle)
        if driver.title == '    ――        ':     #          title      ,    
            break
driver.find_element(By.ID, 'ww').send_keys('selenium')  #           selenium

driver.close()  #         
driver.switch_to.window(handle)  #       ,     
driver.find_element(By.ID, 'kw').send_keys('selenium')   #          selenium
time.sleep(2)
driver.quit()
주의해 야 할 것 은 close()방법 은 현재 있 는 창 만 닫 는 것 이지 만 구동 하 는 브 라 우 저 는 실행 대기 상태 이 며,quit()는 현재 세 션 을 종료 합 니 다.몇 개의 창 을 열 어도 한꺼번에 닫 히 고 브 라 우 저 는 새로운 작업 명령 을 받 지 않 습 니 다.
2.iframe 전환
여러 창 을 열 면 요 소 를 찾 을 수 없 는 것 을 제외 하고 요소 가 iframe 에 포함 되 어 있 으 면 요 소 를 찾 을 수 없습니다.예 를 들 어 현재 다음 과 같은 요소 가 있 습 니 다.

<html>
    <iframe src="a.html" id="frame0" name="frame1">
        <input id="kw" / >
    </iframe>
</html>
이 때 id 가 kw 인 input 태그 요 소 는 iframe 에 있 습 니 다.이 요 소 를 찾 으 려 면 직접 사용 하 십시오.

driver.find_element(By.ID, 'kw')
원 소 를 찾 을 수 없 는 이상 을 던 질 수도 있 습 니 다.그러면 frame 의 전환 을 어떻게 실현 하여 원 소 를 정확하게 찾 을 수 있 습 니까?
2.1 iframe 으로 전환
selenium 은 switch 를 제공 합 니 다.to.frame()방법 은 frame 의 전환 을 실현 하 는 데 사 용 됩 니 다.이 방법 은 id,name,index 와 selenium 의 WebElement 대상 을 수신 하여 전환 을 실현 합 니 다.예 를 들 어 상기 코드 에서 iframe 으로 전환 하려 면 다음 과 같은 코드 를 사용 하여 실현 할 수 있 습 니 다.

from selenium import webdriver

driver = webdriver.Edge()
driver.switch_to.frame('frame0')   #   id  iframe
# driver.switch_to.frame('frame1')   #   name  iframe
# driver.switch_to.frame(0)   #   index  iframe,0     
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  #   WebElement    iframe
일반적인 상황 에서 id 나 name 을 통 해 대부분의 iframe 전환 문 제 를 해결 할 수 있 습 니 다.이 두 가지 속성 이 없 으 면 index 와 WebElement 대상 을 사용 하여 이 루어 집 니 다.
2.2 frame 에서 메 인 화면 으로 전환
테스트 과정 에서 우 리 는 메 인 인터페이스 에서 iframe 으로 전환 할 뿐만 아니 라 frame 의 요 소 를 조작 한 후에 메 인 인터페이스 로 다시 전환 하여 다른 작업 을 해 야 합 니 다.홈 페이지 로 전환 하 는 방법 은 다음 과 같 습 니 다.

driver.switch_to.default_content()
2.3 다 중 iframe 전환
때때로 우 리 는 다 층 프레임 을 끼 워 넣 는 상황 을 만 날 수 있다.아래 와 같다.

<html>
    <iframe src="a.html" id="frame1">
    	    <iframe src="b.html" id="frame2" >
    			<input id="kw" / >
			</iframe>
    </iframe>
</html>
다 층 끼 워 넣 은 상태 에서 메 인 인터페이스 에서 2 층 iframe 으로 전환 하려 면 1 층 1 층 전환 이 필요 합 니 다.즉,먼저 frame 1 로 전환 한 다음 frame 2 로 전환 하 는 것 이 아니 라 frame 2 로 전환 하 는 것 입 니 다.

driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")
selenium 은 부모 frame 으로 전환 하 는 방법 도 제공 했다.예 를 들 어 우리 가 frame 2 로 전환 한 후에 frame 1 로 전환 하려 면 메 인 화면 을 자 른 다음 frame 로 전환 하지 않 고 다음 과 같은 방법 을 사용 해 야 한다.

driver.switch_to.parent_frame()
주의해 야 할 것 은 현재 홈 페이지 면 이 라면 이 방법 을 사용 하면 유효 하지 않 습 니 다.
상기 방법 을 유연 하 게 사용 하면 iframe 의 전환 과 창 전환 문제 에 쉽게 대응 할 수 있 습 니 다.이로부터 위치 가 정 해 지지 않 은 요소 의 고민 과 이별 할 수 있 습 니 다.
python 3+selenium 4 전환 창 과 iframe 을 실현 하 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python 3 selenium 4 전환 창 과 iframe 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기