每当遇到定位不到的元素,你会有哪几方面的反思,等待时间不够?属性不唯一?或许忘了一个庞大的群体性问题——元素不在当前页,不要理解得太狭隘,这个“页面”是广义的。
想想浏览器有哪些操作涉及页面转换?window handler、iframe、alert、prompt、confirm,不列举真想不到页面的种类这么多,方法也是变幻莫测。
标签页(window_handle)
在转换标签页前,先来创建几个用于测试的标签页。
js命令:
js="window.open('http://www.baidu.com')"
driver.execute_script(js)
# 获取当前窗口句柄
current_handle = driver.current_window_handle
print(driver.current_window_handle)
# 指定所有窗口句柄
print(driver.window_handles)
# 转换到指定窗口句柄
driver.switch_to.window(driver.window_handles[1])
current_handle = driver.current_window_handle
print(driver.current_window_handle)
框架嵌入页(iframe、frame)
# 存在唯一id属性
driver.switch_to.frame("id")
# 存在唯一name属性
driver.switch_to.frame("name")
# 定位iframe元素
iframe = driver.find_element_by_css_selector("")
driver.switch_to.frame(iframe)
# 通过index索引定位,同列表顺序
driver.switch_to.frame(1)
# 返回主页面
driver.switch_to.default_content()
# 同层级多个iframe,按照列表顺序指定iframe
# 从指定iframe返回另一ifame
driver.switch_to.parent_frame()
# 从指定iframe返回top页
driver.switch_to.default_content()
# 嵌套iframe,把iframe想象成洋葱,逐层进入
弹出框(alert/confirm/prompt)
# 切换到警告弹出框
propt = driver.switch_to.alert
# 获取alert上的文本信息
propt.text
# 输入框输入信息
propt.send_keys("keyword")
# Alert确认
propt.accept()
# Alert取消
propt.dismiss()
# 给需要验证的Alert发送账号和密码,确认
propt.authenticate("username","password")