关于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()
原文地址:https://www.cnblogs.com/xiamaojjie/p/11396471.html