Frame标签有Frameset、Frame和IFrame 3种,Frameset跟其他普通标签没有区别,不会影响到正常的定位。在页面中经常能看到Frame或IFrame(Frame是整个页面的框架,IFrame是内嵌的框架),由于WebDriver定位元素时只能在一个页面上定位,所以对于IFrame这样的情况,WebDriver是无法直接定位到元素的。Selenium中有对应的方法对Frame进行操作。
WebDriver提供了switch_to.frame()方法来切换Frame,格式如下:
switch_to.frame(定位元素)
1.切换IFrame
案例描述如下:·外部页面有个指向baidu的链接;·内嵌的页面是通过IFrame实现的,嵌套的是Bing首页。
iframe.html页面的实现代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>iframe-HTML</title>
</head>
<body>
<div class="alert" align="center">The link
<a class="alert-link" href="http://www.baidu.com">baidu</a>
</div>
<div class="row-fluid">
<div class="span-ifram" align="center">
<h4 align="center">iframe</h4>
<iframe id = "iname" name="nf" src="https://cn.bing.com" width="800" height="600"></iframe>
</div>
</div>
</body>
</html>
单击Bing搜索页的搜索框完成关键字的搜索。iframe.html代码中IFrame标签的id等于"iname"。实现代码如下:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("D:\\protect\\python\\selenuim\\module\\iframe.html")
driver.switch_to.frame("iname")#切换窗体
time.sleep(2)
driver.find_element_by_xpath("//*[@id='sb_form_q']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='sb_form_go']").click()
time.sleep(2)
driver.quit()
2.切换到主窗体
当切换到子窗体Frame中之后,便不能继续操作主窗体中的元素了,这时如果要操作主窗体中的元素,则需切换回主窗体。
基于上面的用例,当对Bing搜索页完成操作后,如想单击外部的baidu链接,则需要切换到主窗体。切换到主窗体的方法是driver.switch_to.default_content()。实现代码如下:
driver.get("D:\\protect\\python\\selenuim\\module\\iframe.html")
driver.switch_to.frame("iname")#切换窗体
time.sleep(2)
driver.find_element_by_xpath("//*[@id='sb_form_q']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='sb_form_go']").click()
driver.switch_to.default_content()#跳到最外层
driver.find_element_by_xpath("/html/body/div[1]/a").click()
time.sleep(2)
driver.quit()
网友评论