6 、 多层窗口定位
多层窗口指的是在操作系统图形界面中,一个窗口被另一个窗口覆盖的情况。在多层窗口中,如何定位需要操作的窗口?
一种常见的方法是使用操作系统提供的Alt+Tab快捷键,可以在打开的所有窗口中快速切换焦点。如果需要在多个同级窗口中切换,还可以使用Alt+~(波浪号)键。
对于多层窗口的情况,可以使用以下方法:
- 使用鼠标:通过点击窗口的标题栏或任务栏上该窗口的缩略图,可以将焦点快速切换到需要的窗口。
- 使用Alt+Tab:按住Alt键不放,然后反复按下Tab键,可以在所有打开的窗口间快速切换焦点。当需要定位的窗口被选中时,松开Alt键即可切换到该窗口。
- 使用Win+Tab:在Windows 10中,可以使用Win+Tab键来进入任务视图,该视图显示所有打开的窗口和虚拟桌面。使用鼠标或方向键,可以选择需要的窗口。
- 使用Alt+Esc:按下Alt+Esc键可以在打开的所有窗口中循环切换焦点,直到找到需要的窗口。
- 使用任务管理器:在需要的窗口没有响应或无法定位时,可以通过任务管理器来关闭或切换窗口。按下Ctrl+Shift+Esc键打开任务管理器,选择需要的窗口并点击“切换到”按钮或按下Alt+Tab键切换到该窗口。若窗口无响应,可以点击“结束任务”按钮关闭窗口。
6.1 多层框架定位
在 web 的自动化测试工作中,通常会碰到一个元素无法定位的问题,检查了很多次, 依然得不到解决,此时就需要了解下 html 的 frame 框架了,frame 可以实现一个窗口 中显示多个 html 文件,而当我们使用 selenium 打开页面后,定位元素时,发现无法 定位,此时需要确定自己要操作的元素在哪个 frame 中。
下面这段 html 代码是将百度的页面封装在一个 frame 中,如果还想之前那样操作,则 无法定位百度页面的元素,此时需要先定位到它所在的 frame 中,才能定位,使用switch_to_frame 方法切换不同的 frame。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>test</title> </head> <body> <div class="row-fluid"> <div class="span6 well"> <h3>test</h3> <iframe id="f2" src="http://www.baidu.com" width="700"height="500"></iframe> <h3>*******************</h3> <a href="javascript:alert('watir-webdriver better than selenium webdriver;')">click</a> </div> </div> </body> </html>
将上面代码保存为 test.html ,运行结果如下:
在这个案例中,我们可以直接定位到 click 这个链接,却无法定位到百度的搜索输入框, 通过上面的 html 代码能看出,百度的页面是放在 id 为 f2 的框架中,所以需要先切换到 f2 的框架,然后在定位到输入框。
from selenium import webdriver 导入 webdriver driver = webdriver.Firefox() 打开浏览器 driver.get('file:///D:/test/test.html') 打开 test.html driver.switch_to_frame('f2') 先切换到 f2 的 frame 框架中 driver.find_element_by_id('kw').send_keys('test') 在定位百度的输入框 driver.switch_to_default_content() 重新回到之前的 frame driver.find_element_by_tag_name('a').click() 此时才能操作 click 这个链接
在切换到 f2 的 frame 之后,对里面的操作完成后,往往还要回到之前的 frame,才能继续下一步的操作,此时可以通过 switch_to_default_content()方法返回。
6.2 多层窗口定位
在页面操作时,有些时候会出现多个窗口的情况,比如,点击一个链接后,会打开一个新的窗口,此时想要对新窗口进行操作时,就必须先切换到新的窗口才能继续操作, 可以通过switch_to_window()方法来实现。下面通过代码来实现点击一个创意项目之后,会弹出该项目的具体信息页面,此时需要切换到新页面才能操作。
from selenium import webdriver 导入 webdriver driver=webdriver.Firefox() 打开 firefox 浏览器 driver.get('http://www.chuangyijia.com/admin/login') 打开 LMD 的登陆页面 driver.implicitly_wait(3) driver.find_element_by_xpath('//form[@id="login"]/input[1]'). send_keys('lib@163.com') 输入邮箱 driver.find_element_by_xpath('//form[@id="login"]/input[2]'). send_keys('12345678') 输入密码 driver.find_element_by_xpath('//button[contains(text(),"登录 ")]').click() 点击登陆 driver.implicitly_wait(3) 等待 3 秒 driver.find_element_by_css_selector('#dashboard-menu > li:nth-child(2) > a:nth-child(1)').click() 点击待审核项目 driver.find_element_by_link_text('预售管理').click() 点击预售管理 driver.find_element_by_css_selector('.table > tbody:nth- child(2) > tr:nth-child(1) > td:nth-child(4) > a:nth-child(1)').click() 点击预售管理中的第一个项目的标题,此时会弹出一个新的窗口 print driver.title 打印当前窗口的 title,输出结果说明, 此时还是在之前的窗口操作的,并没有切换到新的窗口 window=driver.window_handles 获取当前所有的浏览器操作句柄 driver.switch_to_window(window[1]) 切换到新窗口 print driver.title 打印新窗口的 title
从上面的案例中,我们需要先获取窗口的句柄,然后再进行切换的,句柄的规则是,按打开顺序来看,管理页面的窗口是第一个被打开的,那么他的句柄下标为 0,新窗口是第二个被打开的,那么它的句柄下标是 1。window 变量接收当前所有窗口的句柄,通过 switch_to_window(window[1])切换到新窗口,同样也可以通过 switch_to_window(window[0])回到之前的页面。