UI自动化:窗口/iframe/alert切换
窗口切换
在使用元素定位的过程中,我们只能定位到同一个页面下的元素,如果有打开新的窗口,需要定位新窗口的内容,直接使用定位是找不到元素的。此时就要进行窗口切换,把当前定位的窗口换到新窗口上,那就涉及到一个新的概念:句柄,句柄是一个浏览器窗口的特性,是一串字符串,每个窗口的句柄都是不一样的,所以我们可以通过句柄切换到对应的窗口。
操作如下,在打开新窗口以后,首先获取所有的窗口句柄,切换到最新的窗口:
# 获取所有的窗口句柄 handles = dr.window_handles # 切换到最新打开的窗口 dr.switch_to.window(handles[-1])
iframe切换
iframe是一种特殊的窗口,内嵌在页面之中,在前端静态HTML表示为一个标签,但是它又和新窗口一样,其中的元素无法被直接定位,需要进行切换;
切换到iframe有三种方式,通过索引、name属性、元素本身;
举例使用元素本身切换,首先要定位到iframe标签,然后切换即可:
# 定位iframe元素 iframe_element = dr.find_element_by_name('//iframe[@name="new_iframe"]') # 切换 dr.switch_to.frame(iframe_element)
如何从iframe切回主页面呢?其实很简单,
dr.switch_to.default_content()
另外,还可能出现iframe多层嵌套的情况,如果需要返回父级iframe,只需要,
dr.switch_to.parent_frame()
alert弹窗切换
alert弹窗本质是js原生代码,不是标签元素,并且一个页面中最多有且仅有一个alert弹窗,如果页面中出现了alert弹窗,一定要先处理它,不然无法进行其他操作。alert弹窗切换的操作非常简单,
# 切换到alert弹窗,返回一个Alert的实例对象 alert_obj = dr.switch_to.alert # 点击确认按钮 alert_obj.accept() # 点击取消按钮 alert_obj.dismiss()
窗口切换其实和元素定位查找一样,都需要时间加载,由于这几种切换比较特殊,所以采用显式等待的方式比较合适,
# 窗口切换显式等待 WebDriverWait(dr, 10, 0.5).until( expected_conditions.new_window_is_opened(handles) ) # iframe切换显式等待 WebDriverWait(dr, 10, 0.5).until( expected_conditions.frame_to_be_available_and_switch_to_it(iframe_element) ) # alert切换显式等待 WebDriverWait(dr, 10, 0.5).until( expected_conditions.alert_is_present() )