今天上班閑來無聊,於是來練練自動化,結果碰上了可惡的iframe,樓主,以前也遇到過,但是一直也沒搞懂怎么處理的,都是抄別人的代碼,今天決定獨立解決試試。首先先來認識什么是iframe,它就長下圖這樣
我要操作的是屬性是輸入郵箱賬號那里,我試過了我所掌握的所有xpath語法,結果一直定位不到這個元素,搞得我也是信心受挫。無意間我移動了下鼠標,才發現那里嵌了個iframe。要知道頁面是否嵌套iframe可以借助火狐的一個插件firebug來查看。用firebug查看元素如果有iframe會顯示iframe#xxx,沒有iframe會顯示top wondow。看下圖左下角長這樣iframe#xxx
問題找到了就開始解決。思路,既然要操作的元素在iframe上,我們就要先進行切換到iframe里面去。先定位iframe的位置
self.iframe = self.driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe[@scrolling = "no"]'),我這里用的xpath,也可以用id,name這些的。定位到了如下圖所示
根據xpath的一個插件顯示我寫的xpath已經定位到了iframe上,接下來就用 self.driver.switch_to.frame(self.iframe)切換到iframe里面,前面定位到iframe的位置,最好用一個變量接收存起來,然后再用switch_to切換到里面去,接下來就是正常定位元素的操作了。(當iframe上的操作完后,想重新返回主頁面上操作元素,返時候,就可以用switch_to_default_content()方法返回到主頁面面)這句話,來源於上海悠悠博客資料。我這里因為操作完了就登錄了,所以就沒有返回到主頁面的操作,這里返回主頁面指的是退出iframe內嵌屬性。
from selenium import webdriver import time class WangYi_Email(): def __init__(self): '''打開瀏覽器''' self.driver = webdriver.Chrome() def OpenEmail(self,url): '''傳入網易郵箱url''' self.driver.get(url) self.driver.maximize_window() time.sleep(0.01) def LoginEmail(self,email,password): '''輸入賬號和密碼和iframe的處理''' # todo 點擊密碼登錄 self.driver.find_element_by_xpath('//a[text()="密碼登錄"]').click() # todo 定位iframe self.iframe = self.driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe[@scrolling = "no"]') # todo switch_to.frame進入到iframe里面去 self.driver.switch_to.frame(self.iframe) # todo 輸入郵箱號 self.driver.find_element_by_xpath('//input[@name="email"]').send_keys(email) # todo 輸入密碼 self.driver.find_element_by_xpath('//div[@class="u-input box"]//input[@name="password"]').send_keys(password) # todo 點擊登錄 self.driver.find_element_by_xpath('.//*[@id="dologin"]').click() def closed(self): """關閉瀏覽器""" time.sleep(10) self.driver.quit() wy = WangYi_Email() wy.OpenEmail('https://mail.163.com/') wy.LoginEmail('email','password') wy.closed()