窗口切换
handles = driver.window_handles ------获取所有窗口句柄,返回的数据是一个列表类型
driver.switch_to.window(handles[-1]) -----切换窗口,因为返回的数据是列表类型,所以可以根据索引进行切换
窗口等待和window窗口切换
----点击打开新窗口的时候,需要又一个等待的过程;避免窗口没有打开就进行接下来的元素查找,程序报错
WebDriverWait(driver, 30).until(EC.new_window_is_opened(before_handles))
-----等待用的还是之前说的现实等待的句式,条件换成new_window_is_opend.
-----这里的locator是before_handles,就是点击打开新窗口之前的所有窗口句柄;理论来说,点击打开一个新窗口后再获取所有窗口句柄,得到的值肯定会比点击之前多,这样才能符合new_window_is_open这个函数。所以before_handles一定是在点击打开新窗口这个操作之前获取的
---获取当前窗口句柄 driver.current_window_handle
ps:等待只是等待,不具备切换功能,即等待新窗口打开后,当前窗口句柄还是之前的,不会是新打开的那个窗口!
iframe切换
- iframe切换有3种方式:索引/name/webelement
1.1 通过name切换
driver.switch_to.frame("baidu")
1.2 通过webelement切换
iframe_element = driver.find_element_by_xpath('//iframe[@name="baidu"]')
driver.switch_to.frame(iframe_element)
frame等待,等待后自动完成切换
WebDriverWait(driver, 10).until(
EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="baidu"]')))
-
退出iframe,切换回主页面---记住切换回主页面,不然无法定位主页面元素
driver.switch_to.default_content() -
如果有多个iframe嵌套,如何切换到父级iframe
driver.switch_to.parent_frame() -
如何判断需要定位的元素是否在iframe里面
在浏览器查看源码的时候,通过元素定位,然后查看下面元素框,如果有iframe,那么这个元素就是在iframe里面的
定位alert
1 切换到alert,switch_to后面不需要再加括号 driver.switch_to.alert
2. 点击alert的确认按钮 driver.switch_to.alert.accept()
3. 点击alert的取消按钮 driver.switch_to.alert.dismiss()
4. alert等待 WebDriverWait(driver, 10).until(EC.alert_is_present())
点击确认或者取消后,就关闭了弹窗,直接返回的主页面;同一时间内只会弹出一个alert
如何区分是alert还是一个普通元素----通过浏览器定位,可以定位到的就是元素,定位不到的就是alert