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