Selenium--WebDriver窗口切换

对于一个Web系统的前端页面来说,日常的交互除了表单元素,超链接以外,还包括一些窗口对象和对话框对象的操作,这对于Selenium WebDriver来说,都需要进行单独的处理才能够更好地模拟出用户的各类操作。

到目前为止,我们的实验均停留在一个浏览器窗口中进行操作。但是实际的情况是,我们必须会有一些其它的窗口或对话框类型存在,比如在新标签页打开的窗口,或者内嵌在一个iframe中的页面,也或者是一个对话窗口与确认窗口等。本实验主要来解决窗口和对话框之间的切换及处理。

**一、 实 验 目 的 **

[[TOC]]1. 掌握如果利用WebDriver处理对话框和确认框。

在蜗牛进销存商品出库模块中,均可以实现删除功能,但是当我们点击删除时,会弹出一个确认框,我们可以选择点击“确定”或“取消”。但是这是一个特殊的窗口,我们无法正确按照HTML按钮的方式通过find_element_by这种方法对其进行操作,确切来说这是浏览器调用的操作系统级的弹出窗口,如图所示。

alt

这种确认框不仅webdriver的find_element_by方法获取不到,使用工具IDE的select都无法选择到该窗口上的元素。此时我们需要使用WebDriver内置的对对话框和弹出框的特殊处理方法,代码如下:

from selenium import webdriver
import time

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
driver.get('http://localhost:8080/WoniuSales/')
driver.implicitly_wait(10)

driver.find_element_by_id('username').send_keys('admin')
driver.find_element_by_id('password').send_keys('admin123')

#登录时设置了万能密码‘0000’,保证每次登录不用考虑破解验证码
driver.find_element_by_id('verifycode').send_keys('0000')
driver.find_element_by_xpath('//button[@onclick="doLogin(\'null\')"]').click()
#没有填写任何信息的时候就提交出库按钮

driver.find_element_by_id('submit').click()
time.sleep(3)   #为了很清楚的看见效果,强制等待3秒
driver.switch_to.alert.dismiss()  #点击取消按钮

#driver.switch_to.alert.accept()   #点击确定按钮

运行代码,可以看到对话框能够被操作了。总结对话框的操作:

(1)text属性

用法:string = driver.swich_to.alert.text,作用是获取当前对话框的提示信息的文本内容。

(2)accept()方法

用法:driver.swich_to.alert.accept(),其作用是点击对话框的确认按钮。

(3)dismiss()方法

(4)用法:driver.swich_to.alert.dismiss(),其作用是点击对话框的取消按钮。

(5)send_keys()方法

用法:string = wd.swich_to.alert.send_keys(),其作用是向对话框内输入内容,如果不具有文本框则抛出异常。

操作这种弹出的对话框时,一定要先确定是否是属于alert、conform或者prompt,因为通过前端技术css+js操作div一样可以实现。如果是后者,那么大家可以直接用xpath的方式 操作。

[[TOC]]2. 新窗口的切换

在一个页面中打开另外一个新窗口也是经常会遇到的情况,如果我们需要在多个窗口之间切换,例如在百度中搜索了蜗牛学院,点击链接打开蜗牛学院官网,如果想要继续操作蜗牛学院官网上的页面元素时,程序直接抛出找不到元素的异常。如图所示

alt

from selenium import webdriver

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")

 

driver.get(‘http://www.baidu.com’)

driver.implicitly_wait(20)

 

driver.find_element_by_id(‘kw’).send_keys(‘蜗牛学院’)

driver.find_element_by_id(‘su’).click()

driver.find_element_by_link_text(‘蜗牛学院-Java培训|Java学习|Web培训|Java视频|Java自学|成都IT...’).click()

driver.find_element_by_link_text(‘直播课堂’).click()

如果在新打开的页面查找点击直播课堂,就会发现代码异常要解决这个问题则需要使用WebDriver内置的专门用于切换窗口的方法,driver. current_window_handle ()和driver.window_handles ()代码如下:

from selenium import webdriver

 

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")

driver.get(‘http://www.baidu.com’)

driver.implicitly_wait(20)

 

driver.find_element_by_id(‘kw’).send_keys(‘蜗牛学院’)

driver.find_element_by_id(‘su’).click()

s = driver.current_window_handle     #获取当前页面的句柄,返回值为集合

print(s)

alt

修改代码,打开蜗牛学院官网后,再来获取所有句柄,使用方法就需要使用另一个获取方式,driver.window_handles,代码如下:

driver.find_element_by_id(‘kw’).send_keys(‘蜗牛学院’)

driver.find_element_by_id(‘su’).click()

s = driver.window_handles     #获取当前页面的句柄,返回值为集合

print(s)

代码执行结果如图: alt 想要在百度页面搜索蜗牛学院后去点击直播课堂,就不可避免切换页面焦点了,上面的执行结果可以看出,不同页面句柄不同。所以driver.switch_to.window()方法就能实现操作了。

完整代码如下:

from selenium import webdriver

 

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")

driver.get(‘http://www.baidu.com’)

driver.implicitly_wait(20)

 

driver.find_element_by_id(‘kw’).send_keys(‘蜗牛学院’)

driver.find_element_by_id(‘su’).click()

driver.find_element_by_link_text(‘蜗牛学院-Java培训|Java学习|Web培训|Java视频|Java自学|成都IT...’).click()

s_before = driver.current_window_handle

s_behind = driver.window_handles

for i in s_behind:

if i != s_before:

    driver.switch_to.window(i)

#driver.switch_to.window(s_behind[-1])   #也可以不用遍历列表,直接通过索引切换

driver.find_element_by_link_text(‘直播课堂’).click()

注意:如果在新页面操作完成后需要要回到原页面,可以使用driver.switch_to.window(s_before)来实现。这里就再不做代码展示。

[[TOC]] 3. 掌握如何利用WebDriver处理iframe内嵌页。

对于iFrame内嵌页面,我们只需要使用driver.switch_to.frame("参数");进行切换和正常操作即可。其中参数可以是页面的ID号,标题或句柄等。以蜗牛学院官网培训首页的对话框为例。如图所示。 alt

打开培训首页,就会在右侧对话框,如果通过webdriver向输入框里填写内容,是焦点切花的新方式,页面代码如图所示:

alt

想要在文本框内输入信息,需要使用driver.switch_to.frame()的方法,但本页面不止一个iframe,所以需要切换两次。代码如下:

driver.get('http://www.woniuxy.com/train/index.html')
driver.implicitly_wait(20)

driver.switch_to.frame('LR_miniframe')   #第一个ifram有ID属性,直接使用
time.sleep(1)

#第二个iframe使用定位的方式
driver.switch_to.frame(driver.find_element_by_id('FreeTextBox1_editor'))
time.sleep(1)
driver.find_element_by_xpath('/html/body').send_keys('我要报名')

上面两个iframe的焦点切换都可以实现,如果没有ID属性,建议使用第二个iframe的这种方式来切换。想要返回原页面,需要使用default_content()方法。代码如下:

time.sleep(1)
driver.find_element_by_xpath('/html/body').send_keys('我要报名')

driver.switch_to.default_content()

time.sleep(1)

driver.find_element_by_link_text(‘测试开发’).click()
  1. 掌握如何利用WebDriver处理弹出窗口。

待续

全部评论

相关推荐

兄弟找我内推呗:兄弟你问问他们饭菜能打包吗
点赞 评论 收藏
分享
头像
不愿透露姓名的神秘牛友
06-08 12:16
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务