HTML 中,frame 标签有3种类型:frameset、frame、iframe。
对于 frameset ,跟其他普通标签没有区别,都可以正常定位。
而 frame 与 iframe 属于特殊的一种类型,它们内部会包含一个被嵌入的另一份 HTML 文档。
在使用 Selenium 打开网页时,并不包含被嵌入的 HTML 文档。
如果需要操作被嵌入的 HTML 文档内的元素,必须将 操作范围 切换到被嵌入的 HTML 文档中。
Selenium 提供的方法是:
WebDriver.switch_to.frame(frame_reference)
其中, frame_reference 可以是 frame 元素的属性 name 或者 id 的属性值(默认定位方式)。
另外一种情况,如果没有属性 name 或者 id,可以先定位到 frame 元素,再进行切换。
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome() # 打开浏览器
driver.get("https://mail.163.com/") # 跳转至测试页面
sleep(1)
frame_element = driver.find_element_by_xpath("//iframe[contains(@id, 'x-URS-iframe')]") # 先定位到 iframe 元素
driver.switch_to.frame(frame_element) # 切换到 iframe 元素内部
element = driver.find_element_by_name("email") # 定位元素
element.send_keys("123456789") # 输入内容
sleep(3)
driver.quit() # 关闭浏览器
如果需要重新切换出来定位元素,Selenium 提供的方法:
序号 | 方法/属性 | 描述 |
---|---|---|
1 | WebDriver.switch_to.default_content() | 返回主文档 |
2 | WebDriver.switch_to.parent_frame() | 返回父文档 |
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome() # 打开浏览器
driver.get("https://mail.163.com/") # 跳转至测试页面
sleep(1)
frame_element = driver.find_element_by_xpath("//iframe[contains(@id, 'x-URS-iframe')]") # 先定位到 iframe 元素
driver.switch_to.frame(frame_element) # 切换到 iframe 元素内部
element = driver.find_element_by_name("email") # 定位元素
element.send_keys("123456789") # 输入内容
sleep(2)
driver.switch_to.parent_frame() # 返回到父文档
# driver.switch_to.default_content() # 返回到主文档
element1 = driver.find_element_by_link_text("VIP邮箱") # 定位元素
element1.click() # 点击
sleep(3)
driver.quit() # 关闭浏览器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。