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()