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处理弹出窗口。

待续

全部评论

相关推荐

04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务