1.ifram和frameset介绍
frame :HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素 。它通常包含两种形式 ,iframe和frameset .
<iframe>标签规定一个内联框架,一个内联框架被用来在当前 HTML 文档中嵌入另一个文档,通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面。
表现形式为:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试网页</title>
</head>
<body>
<iframe src="/statics/demosource/demo_iframe.htm" name="iframe"></iframe>
<p><a href="https://www.baidu.com" target="iframe_a">测试网页</a></p>
<p><b>注意:</b> 因为 a 标签的 target 属性是名为 iframe_a 的 iframe 框架,所以在点击链接时页面会显示在 iframe框架中。</p>
</body>
</html>
其中HTML页面中有个以iframe开头的标签 ,它的属性name='iframe_a' ,这个就是一个内嵌的框架 。
<frameset>标签 在一个页面中设置一个或多个框架,用<frameset></frameset>代替了<body></body>,不能出现在body标签里。它的表现形式为:
html
<!DOCTYPE html>
<html>
<head>
<title>Frameset Example</title>
</head>
<frameset cols="50%,50%">
<frame src="page1.html" name="frame1">
<frame src="page2.html" name="frame2">
</frameset>
</html>
需要注意的是,由于 framesets 和 frames 已经被视为过时技术,并且在现代 web 开发中很少使用,因此许多现代浏览器可能不再支持 framesets,或者对其支持有限。此外,framesets 在无障碍性和可维护性方面存在许多问题,因此通常不建议在新的 web 项目中使用。
2.具体案例
出现以上形式的页面,通过以前介绍的方法是无法定位的 ,需要用到如下的方法才能操作 。
以下为selenium提供的方法 :
python
# 方法
1. driver.switch_to.frame(frame_reference) : 其中frame_reference的值就是frame标签中的id或name的值 。
2. driver.switch_to.default_content() :恢复默认页面方法
具体代码 :
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 设置 WebDriver 路径(根据你的实际路径进行调整)
chrome_driver_path = '/path/to/chromedriver'
# 初始化 WebDriver
driver = webdriver.Chrome(executable_path=chrome_driver_path)
# 打开 frameset 页面
driver.get('file:///path/to/your/frameset_page.html')
# 切换到name为 'frame1' 的 框架上
driver.switch_to.frame('frame1')
# 定位 page1.html 中的元素
# 假设你要定位一个 id 为 'myElement' 的元素
driver.until(EC.presence_of_element_located((By.ID, 'myElement'))).click()
# 如果需要切换回主页面或其他 frame,可以使用
# driver.switch_to.default_content()
# 或者
# driver.switch_to.frame('otherFrameName')
# 关闭浏览器
driver.quit()
再比如qq空间就是iframe布局 ,登录qq空间主页 ,点击登录 ,就必须使用这个切换 。代码示例:
python
url = "http://i.qq.com"
driver.switch_to.frame('login_frame') # 切换到login_frame框架
driver.find_element_by_id("switcher_plogin").click()