許多人在執行腳本的時候會發現,明明本身的元素路徑沒寫錯啊!怎麼仍是報元素未找到的異常呢?是的,沒錯,你多是趕上iframe啦!下面將介紹關於iframe的相關操做。web
例子:以163郵箱登陸頁面爲例框架
若是你直接去定位帳號輸入框元素的話是定位不成功的,看到上圖標紅處的箭頭沒,原來這個元素在iframe框架裏面,要想定位這個元素,必須先切換到這個iframe內才行。咱們先找到iframe這層。以下圖:ui
代碼:spa
from selenium import webdriver # 導入webdriver
import time
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
time.sleep(1)
iframe = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe') # 定位iframe
driver.switch_to.frame(iframe) # 切換iframe框架裏面
a = driver.find_element_by_xpath('//input[@name="email"]') # 定位輸入框元素
a.send_keys('不知不覺多少好時光') # 輸入文本
print(a.get_attribute('value')) # 獲取輸入的value值
driver.quit()
結果:blog
注意:element
1.driver.switch_to.frame()爲新方法,而driver.switch_to_frame()爲老方法。get
2.其實iframe的切換是默認支持id和name的方法的,也就是說假如iframe元素中有id和name屬性(固然,要確保是惟一的,而且不是動態值),你能夠直接使用driver.switch_to.frame('id')或者driver.switch_to.frame('name')進行切換,實際狀況中會遇到沒有id屬性和name屬性爲空的狀況,這時候就須要先定位iframe,把iframe當成一個元素來定位就好了input
3.我這裏因爲iframe的id是動態值,且name爲空,因此就把iframe當成一個元素來處理了iframe
當咱們切換了iframe以後,想要回到上一層框架,怎麼辦呢?webdriver也提供了不錯的方法selenium
1.driver.switch_to.parent_frame() # 回到上一層框架
2.driver.switch_to.default_content() # 一次性回到主框架(當切換了多層iframe以後,用這個太方便了)