当iframe嵌套一个iframe时,如果用iframe的下标切换,里面嵌套的iframe又从下标为0开始,而不是相对于整个dom树的下标,举个栗子:
比如我想点击qq邮箱登录界面的“密码登录”,通过定位查找可以发现密码登录的元素位于页面的ifram中,这时候想要点击就必须切换iframe点击,如果根据iframe的下标来切换,那么我们应该先进入第一个iframe在进入第一个iframe里面的iframe。
第一个iframe位于整个DOM树中的第二个(下标为1),要点击的目标元素所在的iframe位于第一个iframe里面的第一个iframe,这时候这个iframe的下标可不是相对于整个DOM树而言的2了,而是相对于整个DOM树的第二个iframe而言,那么他的下标就是0。
封装好的切换iframe方法:
#切换iframe
def switch_into_iframe(self, iframe_loc, page_action ):
"""
:param iframe_loc: index, id或者name属性的值,元素定位元组。
:return:
"""
logger.info(f"切换进入iframe: {iframe_loc}")
try:
WebDriverWait(self.driver, self.timeout).until(EC.frame_to_be_available_and_switch_to_it(iframe_loc))
except BaseException as msg:
logger.exception('页面操作:{} 失败,报错步骤:{}; 报错原因:{}; 报错文件:{}; 报错行数:{}'
.format(page_action,inspect.currentframe().f_back.f_code.co_name,msg,inspect.stack()[1][0].f_code.co_filename,inspect.currentframe().f_back.f_lineno))
self.save_pageshots(page_action)
raise
实例化后调用封装好的切换iframe和点击方法
目标实现:
test.switch_into_iframe(1,'切换iframe')
test.switch_into_iframe(0,'切换到内嵌iframe')
test.click_element((By.CSS_SELECTOR,'#switcher_plogin'),'点击密码登录')
或者曲线救国:iframe标签的定位或者他的id,name属性的值来切换
test.switch_into_iframe((By.CSS_SELECTOR,".QQMailSdkTool_login_loginBox_qq_iframe"),'切换iframe')
test.switch_into_iframe('ptlogin_iframe','切换到内嵌iframe')
test.click_element((By.CSS_SELECTOR,'#switcher_plogin'),'点击密码登录')
实现结果: