iframe切换

使用场景:当我们定位不到元素时,可能是一个html页面通过iframe嵌套着另一个html页面。

而你定位的那个元素,又刚好是嵌套html里面的元素,

所以这个时候就得先切换iframe,才能定位到。

切换方式:

driver.switch_to.frame(iframe的id或者name/iframe的index/iframe的webelement对象)
iframe的id或者name
iframe的index -- 下标从0开始,driver.switch_to.frame[0],要切换到第n个框架,就传入n-1
iframe的webelement对象 -- driver.find_element()
//iframe[@class="google_ads_iframe_/1090369/B3_0"]
//div[@id="google_ads_iframe_/1090369/B3_0__container__"]//iframe

切换回默认页面:driver.switch_to.default_content()
切换上级框架:driver.switch_to.parent_frame()
 1 import time
 2 from selenium import webdriver
 3 from selenium.webdriver.common.by import By
 4 
 5 
 6 
 7 driver = webdriver.Chrome()
 8 driver.maximize_window()
 9 driver.get("https://www.cnblogs.com/")
10 driver.implicitly_wait(10)
11 # 切换框架
12 driver.switch_to.frame("google_ads_iframe_/1090369/B3_0")
13 driver.find_element(By.XPATH,'//amp-img//img').click()
14 
15 # 切回默认框架
16 driver.switch_to.default_content()
17 # 切回上级框架
18 # driver.switch_to.parent_frame()
19 driver.find_element(By.XPATH,'//a[contains(text(),"首页")]').click()
20 
21 time.sleep(5)
22 driver.quit()

 在显示等待的条件当中,有一个就是跟iframe有关的。
EC.frame_to_be_available_and_switch_to_it() iframe可用并切换进去。
id,name,或者其它定位,要用元组表达。
(By.ID, "iframeResult")
(By.NAME, "iframeResult")

 1 import time
 2 from selenium import webdriver
 3 from selenium.webdriver.common.by import By
 4 from selenium.webdriver.support.wait import WebDriverWait
 5 from selenium.webdriver.support import expected_conditions as EC
 6 
 7 
 8 driver = webdriver.Chrome()
 9 driver.maximize_window()
10 
11 driver.get("https://mail.qq.com/")
12 driver.find_element(By.XPATH,'//div[text()="QQ登录"]').click()
13 
14 
15 # 使用显性等待,切换进入iframe当中.
16 WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'login_frame')))
17 # 在iframe所在的html当中,进行元素定位和操作
18 login = (By.ID, 'switcher_qlogin')
19 #  visibility_of_element_located(locator)locator对应的元素是可见的
20 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(login))
21 driver.find_element(*login).click()
22 
23 driver.switch_to.default_content()
24 
25 time.sleep(5)
26 driver.quit()

 

posted @ 2022-12-16 15:35  **山止川行**  阅读(199)  评论(0编辑  收藏  举报