定位元素时总是失败,F12查看页面代码时发现进入了不同的框架,那么在一个框架中需要定位另外一个框架的元素时,就要先切换框架,然后进行页面的常规操作。
方法一:找到每个框架唯一的元素定位,再进行准确切换
ele = (By.XPATH, '//*[@id="tab390010106"]//iframe')
self.normal_click(ele, model="点击iframe框架 ")
iframe_ele = self.find_element(ele, model="切换iframe框架 ")
self.driver.switch_to.frame(iframe_ele)
方法二:每次都返回默认的框架,默认框架是第一个,打开的其他框架就是第二个,这样就可以直接切换到第二个框架
self.driver.switch_to.default_content()
view_details_iframe = self.find_element((By.XPATH, '(//*[@id="ifmain"])[2]'), '定位第二个iframe元素')
self.switch_iframe(view_details_iframe)
方法三:存在多个iframe,当页面跳转时则需要传入iframe的src值。
写一个跳转iframe的公共方法,方法调用在page页面的init中完成。后续的page 方法就可以省略跳转相关的内容了。一劳永逸 nice!
# action def __init__(self, selenium_driver): super().__init__(selenium_driver) src = "/erp/jsp/ehr/emp/empManage.jsp" self.EHR_switch_iframe(src) self.on_page(self.PUF)
# EHR系统存在多个iframe,当页面跳转时则需要传入iframe的src值 def EHR_switch_iframe(self, frame_src): # 等待 iframe 存在 self.driver.switch_to.default_content() self.logger.info('iframe 切换操作:') self.driver.switch_to.default_content() all_iframe = self.find_elements((By.XPATH, "//*[@id='ifmain']")) for i in range(0, len(all_iframe)): if frame_src in all_iframe[i].get_attribute("src"): self.driver.switch_to.frame(all_iframe[i]) self.logger.info("已切换到目标iframe")