当前位置:网站首页>Selenium经典面试题-多窗口切换解决方案
Selenium经典面试题-多窗口切换解决方案
2022-07-01 00:57:00 【码同学软件测试】
在做web端自动化测试用例编写过程中,大家有没有遇到窗口切换的情况,比如如下截图所示的商品列表页,点击任何一款产品后切换到这块产品详情页的情况。

此时浏览器中叠放了两个窗口, 如下截图这种情况;

或者出现打开两个浏览器窗口的情况,如下截图这种情况。

这两种窗口切换的情况下大家的自动化测试脚本是如何编写的呢?

还是不需要单独处理窗口切换?如果是使用selenium框架编写涉及窗口切换的自动化测试用例,肯定要单独处理窗口切换的情况。
那么为什么要对出现新窗口的情况单独处理呢?因为我们通过浏览器驱动对象访问指定url对应的是一个窗口X,当在窗口X执行某个操作(例如点击)导致新开一个页面或者新窗口Y,这种情况下selenium没有做智能处理,而把主动权交给了脚本编写人员来决定浏览器驱动对象在X还是Y窗口上模拟用户的操作行为。
那么接下来我们就需要去实现如何让窗口切换到我们预期的窗口,还是拿我们文章开头的例子来说吧,我需要从商品列表页切换到商品详情页,大体有4种解决方案,分别是:遍历找到预期窗口再进行切换、遍历过程中先切换窗口再判断预期窗口、指定窗口切换、多个条件判断预期窗口。接下来就需要解决我如何找到执行某个操作前后的窗口唯一标识,就像人和人之间的区别是身份证,出现商品列表页、商品详情页的情况下这两个窗口如何区分呢?
通过句柄,每个窗口都拥有一个唯一标识句柄,如果感兴趣的读者可以将句柄打印出来看看,其实就是一串作为唯一标识的字符串。
那么selenium框架web自动化情况下,我们如何来获取句柄呢?通过getWindowHandle()方法来获取当前页面的句柄。接下来我们尝试通过第一种解决方案遍历找到预期窗口再进行切换来获取,具体的代码实现逻辑为在执行点击某款产品前获取窗口句柄,然后定位某款产品元素并调用点击方法,然后调用getWindowHandles()方法获取当前所有打开窗口的句柄集合,也就是商品列表页以及商品详情页的句柄集合,接下来要做的就是遍历句柄集合中的元素,遍历的过程中判断当前这个句柄是否和点击操作前的句柄相同,如果不相同则切换到这个句柄对应的窗口,那么读者可能会问,切换窗口的方法是哪个?是switchTo()。下面给读者们提供一份样例代码块。

读者们平时写测试用例涉及到多窗口切换的情况下,一般用这个方法就可以搞定。当然如果非常确定执行点击等操作后只新开一个窗口的话,还可以使用指定窗口切换这个解决方案,代码的实现逻辑就比较简单了,区分于方案一的地方就是将句柄集合转换成数组,然后通过指定数组下标来实现窗口切换,如下是给大家提供的实现代码块:

如果出现多个叠加操作导致打开多个窗口的情况,还可以采用遍历过程中先切换窗口再判断预期窗口的方案,该方案区别于方案之处在于先执行窗口切换,然后再判断当前窗口句柄和预期的窗口句柄是否一致,如果一致,则停止遍历,依然给大家一段参考的实现代码,如下所示:

以上代码块中实现的停止切换窗口的条件是,当前切换到的窗口title属性值是否是我预期窗口的title属性值,如果是则停止继续切换窗口。看到这里有读者可能会问了,如果有多个窗口的title属性值都相同,这个方案就不管用了吧?是的,但是我们可以尝试替换判断条件,例如判断当前切换到的窗口url和预期的url是否一致,这个判断比较保险,不同的窗口对应的url一般是不同的,但是如果前端代码版本更新时修改了url,此时我们的测试用例该部分信息也需要跟着修改,不要郁闷还有其他的替代解决方案,判断条件可以有一个变成多个,以上是针对多窗口切换情况的常用解决方案以及应用场景,希望能帮到我们的读者朋友。
边栏推荐
- New opportunities for vr/ar brought by metauniverse
- Exploration and practice of "flow batch integration" in JD
- 3dsmax插件开发遍历节点对象和Object获取及INode变换矩阵说明
- [stack] 921 Minimum Add to Make Parentheses Valid
- System. Csrebot for commandline
- Applet Custom Grid
- MFC TCP communication server client demo notes vs2019
- Understanding and application of Qt5 layout in creation
- Some essential differences
- Koa koa combine routes sub route management
猜你喜欢

微生物健康,食品微生物检测为什么很重要

工作八年的程序员,却拿着毕业三年的工资,再不开窍就真晚了...

Using recyclerreview to show banner is very simple

"Open math input panel" in MathType editing in win11 is gray and cannot be edited

Looksrare team's "cash out" caused disturbance
![[Qt5 tab] tab label and content hierarchical analysis](/img/cc/c8c2e79877a958f742a8e9e60ceb43.png)
[Qt5 tab] tab label and content hierarchical analysis

Unknown database connection database error

未来的 Web3会带来什么?

Lecun, a Turing Award winner, pointed out that the future of AI lies in self-learning, and the company has embarked on the journey

Ks009 implementation of pet management system based on SSH
随机推荐
Thinking brought by strictmode -strictmode principle (5)
【Proteus仿真】Arduino UNO +74C922键盘解码驱动4X4矩阵键盘
Why build a personal blog
PHP array splicing MySQL in statement
图灵奖得主LeCun指明AI未来的出路在于自主学习,这家公司已踏上征途
【队列】933. Number of Recent Calls
TypeError: Argument ‘angle‘ can not be treated as a double
Relationship between ASCII, Unicode, GBK, UTF-8
Typora的使用
Ks009 implementation of pet management system based on SSH
laravel 事件 & 订阅
面对产业互联网的时候,甚至还用消费互联网的方式和方法去落地和实践产业互联网
Sécurité et santé microbiennes, qu'est - ce que le traitement biologique?
Composants de la grille de données portatifs
mysql插入\更新前+判断条件
One of the basics - overview of sta Basics
Note d'étude du DC: zéro dans le chapitre officiel - - Aperçu et introduction du processus de base
短信在企业中的应用有哪些?
System settings large page
3dsmax plug-in development traversal node object and object acquisition and inode transformation matrix description