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()
)
posted @ 2020-03-19 21:24  suanmiao  阅读(1154)  评论(0编辑  收藏  举报