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
导入 webdriverdriver = webdriver.Firefox()
打开浏览器driver.get('file:///D:/test/test.html')
打开 test.htmldriver.switch_to_frame('f2')
先切换到 f2 的 frame 框架中driver.find_element_by_id('kw').send_keys('test')
在定位百度的输入框driver.switch_to_default_content()
重新回到之前的 framedriver.find_element_by_tag_name('a').click()
此时才能操作 click 这个链接
在切换到 f2 的 frame 之后,对里面的操作完成后,往往还要回到之前的 frame,才能继续下一步的操作,此时可以通过 switch_to_default_content()方法返回。
6.2 多层窗口定位
在页面操作时,有些时候会出现多个窗口的情况,比如,点击一个链接后,会打开一个新的窗口,此时想要对新窗口进行操作时,就必须先切换到新的窗口才能继续操作, 可以通过switch_to_window()方法来实现。下面通过代码来实现点击一个创意项目之后,会弹出该项目的具体信息页面,此时需要切换到新页面才能操作。
from selenium import webdriver
导入 webdriverdriver=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])回到之前的页面。