一、frame和iframe区别
Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性。frame是整个页面的框架,iframe是内嵌的网页元素,也可以说是内嵌的框架。
Iframe标记又叫浮动帧标记,可以用它将一个HTML文档嵌入在一个HTML中显示。它和Frame标记的最大区别是在网页中嵌入的<Iframe></Iframe>所包含的内容与整个页面是一个整体,而<Frame></Frame>所包含的内容是一个独立的个体,是可以独立显示的。另外,应用Iframe还可以在同一个页面中多次显示同一内容,而不必重复这段内容的代码。
二、163登录界面
1.打开http://mail.163.com登录页面
2.用firebug定位登录框
3.鼠标停留在左下角(定位到iframe位置)时,右上角整个登录框显示灰色,说明iframe区域是整个登陆框域
4.iframe的ID也是随机生成
关于怎么查找当前页面iframe可借助Try XPath,相关介绍:《元素定位工具:Try XPath》
三、定位frame的几种方式
driver.switchTo.frame(0) #用frame的index来定位,第一个是0
driver.switchTo.frame("frame_id") #用id来定位
driver.switchTo().frame("frame_name") #用name来定位
driver.switchTo().frame(driver.findElement(By.tagName("ifram"))) #用WebElement来定位
driver.switchTo().parentFrame() #跳转到父级iframe
driver.switchTo().defaultContend() #跳转到默认iframe
以上是java语法下的方法调用,思路可套用到其他语言中去
四、解决方案
1.使用switch_to.frame(index)切换到frame下
from selenium import webdriver driver = webdriver.Firefox() driver.get("https://mail.163.com/") driver.switch_to.frame(2) driver.find_element_by_xpath("//input[@data-loginname='loginEmail']").clear() driver.find_element_by_xpath("//input[@data-loginname='loginEmail']").send_keys("user_name") driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").clear() driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").send_keys("password") driver.find_element_by_xpath("//a[@id='dologin']").click() driver.quit()
2.使用WebElement来定位