關於selenium自動化對iframe內嵌元素的處理


今天上班閑來無聊,於是來練練自動化,結果碰上了可惡的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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM