今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的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()