网页frame与多窗口,多浏览器,上传弹框处理
Selenium处理多窗口场景
多个窗口识别与切换
点击某些链接,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,就可以i在多个页面之间灵活操作。
处理流程:
1.先获取当前窗口的句柄
driver.current_window_handle
2.再获取所有窗口句柄
driver.window_handles
3.判断是否为想要操作的窗口,如果是,就可以对窗口进行操作,如果不是,跳转到另外一个窗口,对另一个窗口进行操作
driver.switch_to_window
Selenium处理frame
多个frame识别与切换
在做web自动化的时候,如果一个元素定位不到,很可能是因为该元素在iframe中
frame是HTML中的框架,在HTML中所谓的框架就是可以在同一个浏览器中显式不止一个页面
基于HTML的框架,又可分为垂直框架和水平框架(cols,rows)
frame分类
frame标签包含frameset、frame、iframe三种
frameset和普通的标签一样,不会影响正常的定位,可以使用index、id、name、webelement任意种方式定位frame
frame与iframe对selenium定位来说是一样的,selenium有一组方法对frame进行操作:
driver.switch_to.frame() # 根据元素id或者index切换frame
driver.switch_to.default_content() # 切换到默认frame
driver.switch_to.parent_frame() # 切换到父级frame
未嵌套的iframe
driver.switch_to_frame("frame的id")
driver.switch_to_frame("frame-index") # frame无id的时候可以根据索引来处理,索引从0开始,如:driver.switch_to_frame(0)
嵌套的iframe
这个时候先进入到iframe的父节点,再进入到子节点,然后进行操作
driver.switch_to.frame("父节点")
driver.switch_to.frame("子节点")
多浏览器处理
通过传递不同的参数来处理不同的浏览器,比如把浏览器类型当作一个参数传到os.getenv方法中,然后根据传过来的参数进行判断选择不同的浏览器
def setup(self):
browser = os.getenv("browser")
if browser == 'firefox':
self.driver = webdriver.Firefox()
elif browser == 'chrome'
self.driver = webdriver.Chrome()
文件上传处理
input标签
可以直接使用send_keys(文件地址)上传文件:
el = driver.find_element_by_id("上传按钮id")
el.send_keys("文件路径+文件名")
弹框处理机制
在页面操作时会遇到一些JavaScript生成的alert,confirm,prompt弹框,这个时候可以用switch_to.alert()方法定位到。然后用text/accept/dismiss/send_keys等方法进行操作。
switch_to.alert() # 获取当前页面上的警告框
text() # 返回alert/confirm/prompt中的文字信息
accept() # 接受现有警告框
dissmiss() # 解散现有警告框
send_keys(keysToSend) # 发送文本至警告框,keysToSend:将文本发送至警告框
识别弹框是JavaScript生成的alert还是个div组件的最简单粗暴的方法:alert无法在浏览器的开发者工具中定位到