在web自动化中,如果一个元素定位不到,那么很大可能是在iframe中
什么是frame?
- frame是html的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面
- 基于html的框架,又分为垂直框架和水平框架(cols、rows)
frame 分类
- frame标签包含framest、frame、iframe三种
- framest和普通的标签一样,不会影响正常的定位,可以使用index、id、name、webelement任意种方式定位frame
- 而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame操作
多frame切换
切换frame
- driver.switch_to.frame() # 根据元素id或者index切换frame
- driver.switch_to.default_content() #切换到默认frame
- driver.switch_to.parent_frame() #切换到父级frame
切换未嵌套的frame
- driver.switch_to_frame(“frame的ID”)
- driver.switch_to_frame(“frame-index”) frame无ID的时候依据索引来处理,索引从0开始 driver.switch_to_frame(0)
处理嵌套的iframe
- 对于嵌套的先进入到iframe的父节点,再进到子节点,然后可以对子节点里面的对象进行处理和操作
- driver.switch_to.frame(“父节点”)
- driver.switch_to.frame(“子节点”)
代码
import time
from selenium import webdriver
class TestFrame:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(1)
self.driver.maximize_window()
def teardown(self):
self.driver.quit()
def test_frame(self):
self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
self.driver.switch_to.frame('iframeResult')
draggable_button = self.driver.find_element_by_id('draggable')
print(draggable_button.text)
self.driver.switch_to_default_content()
run_button = self.driver.find_element_by_id('submitBTN')
print(run_button.text)
time.sleep(5)