webdriver--定位一组元素+iframe表单切换
- 定位一组元素:find_elements,返回的是list,所以可以用列表的索引对列表里的某个元素操作,也可以用for循环访问list,依次操作各元素
driver.find_elements_by_name("OpenType")[1].click()#公开类型 #推送范围 for push in driver.find_elements_by_name("GroupName"): push.click() time.sleep(1)
定位一组元素时,形成的是list,所以list的相关语法都可以使用,切片、添加、删除、遍历都可以
- iframe表单切换
最开始接触到这个iframe切换的契机是,当时页面有个弹窗,按照网上查找到的弹窗处理方式,获取句柄,然后切到该弹窗,再定位弹窗内的元素。但是怎么都无法成功,定位不到弹窗里的元素。后来问开发,看了看前端代码,原来这个弹窗不是window窗口,而是iframe表单嵌套页面,所以执行出错。webdriver只能在一个页面上对元素识别和定位,对frame/iframe表单内嵌页面的元素无法直接定位,所以也是需要通过swtich_to.frame()将当前定位的主题切换到表单内,表单处理完,还需要再切回原主体,才能再继续操作原主体的元素。所以啊,还是需要对前端了解熟悉才行,需要学习的更多了。。。
这段就是当时碰到的iframe嵌套的弹窗
#课程基础知识页的章节选择
1 driver.find_element_by_id("menuled").click() 2 driver.switch_to.frame("layui-layer-iframe1")#刚好id唯一,用id定位 3 driver.find_elements_by_class_name("ico-round")[0].click()#选择某个章节 4 driver.find_element_by_class_name("u-btn-clagre").click() 5 driver.switch_to.default_content()#返回基础页
这段是页面的一个富文本的控件,用iframe嵌套的
#检测任务维护页面
1 driver.get("http://www.zgckxt.com/THome/PC_SelfLearn/Index?id=1056&type=1") 2 driver.find_element_by_css_selector("div.m-ico>a.marr20>i.ico-queedit").click() 3 time.sleep(5) 4 driver.find_element_by_css_selector("#sinquestion").click()#选择检测任务:单选题 5 time.sleep(5)#选择题型后,题干和选项会有个加载时间,所以需要设置页面等待时间 6 list = driver.find_elements_by_css_selector(".cke_wysiwyg_frame")#从学习任务到检测任务的解析,一共7个这种iframe嵌套的控件 7 #del list[0] 8 list.pop(0)#去掉学习任务 9 list.pop()#去掉题目解析 10 n = 0 11 for qframe in list: 12 if n == 0: 13 driver.switch_to.frame(qframe) 14 driver.find_element_by_css_selector(".cke_editable").send_keys("单选题题干") 15 driver.switch_to.default_content() 16 js = "window.scrollTo(document.documentElement.scrollTop,document.documentElement.scrollLeft+600);" 17 driver.execute_script(js) 18 else: 19 driver.switch_to.frame(qframe) 20 driver.find_element_by_css_selector(".cke_editable").send_keys("单选题选项%d"% n) 21 driver.switch_to.default_content() 22 n = n + 1 23 driver.find_element_by_xpath(".//*[@id='rightbox']/div[4]/div[2]/a[2]").click() 24 time.sleep(3)
可以用switch_to.parent_content()方法跳出当前表单,返回上一级,default_content返回最外层的表单