选择窗口的困难之处
在录制测试用例时,窗口管理通常会成为一个问题,测试用例可能会打开一个弹出窗口,或遵循一个 target=_blank
链接。尽管如此,Selenium IDE 预计会遵循并录制窗口和选项卡切换,这样无需在录制后进行手动修复。
但问题在于选择窗口是有状态的。
选择窗口的演变
选择窗口最初是在旧版 IDE 中引入的(又名 selectWindow),它当时也知道,无法根据任何定义的属性(标题、网址等)来跟踪窗口...
相反,它为每个窗口生成了一个临时 ID,要求用户手动干预并为每个窗口赋予一个永久 ID,这是由于 IDE 覆盖了 _blank
目标,而是将调用重定向到 window.open
。
后来出现了 SideeX,他们的解决方案更直观,但目光短浅。他们的想法是利用 browser.webNavigation.onCreatedNavigationTarget
,此事件让 IDE 知道何时打开了一个新选项卡或窗口,以及它的创建原因。这很容易导致映射打开的选项卡树,根据它们的出现顺序为它们分配所有 ID。
通过这种方式,用户自然可以选择他们想要的任何窗口,而无需过多考虑幕后发生的事情。
这两种解决方案都有缺点。旧版解决方案要求用户随时了解打开的选项卡的状态,并在每次调用同一窗口时提供相同的 ID。
另一方面,SideeX 没有考虑 IDE 的未来添加,现在有了控制流命令,即使在录制期间,窗口也可能永远不会打开,或者更糟的是,窗口可能在一个循环中打开,这进一步复杂化了跟踪机制。
中间人解决方案
此时我们知道两件事
- 我们不能让用户手动弄清楚窗口布局。
- 我们不能依靠窗口通过属性或索引来识别它们。
相反,我们将使用中间人解决方案,我称之为解决方案,因为它既要求用户为其窗口命名,又会始终如一地跟踪窗口,并在录制后立即执行。
当我们意识到窗口已打开时,不会根据其出现的顺序生成 ID,而是将其句柄保存到用户将命名的变量中。
从这一点开始,我们可以通过 ID 而不是索引可靠地引用窗口。
click
命令现在可以指定它打开一个新窗口,然后用户可以给窗口命名,并设置超时以等待该窗口出现。
在录制时,IDE 将假定等待 2 秒,并将为窗口生成一个名称。
发布计划
使用较新版本的 IDE 打开 IDE 项目会自动将测试脚本迁移为使用新的 select window
命令。
迁移将尝试识别何时打开新窗口,并将该命令设置为打开窗口,并将生成句柄名称并设置超时为 2 秒。
在某些情况下,IDE 无法识别哪个命令启动了窗口的打开,测试用例将失败,用户将不得不修改迁移。
此外,在用户在初始窗口中来回切换的测试用例中,IDE 将使用新的 store current window handle
命令保存初始窗口的句柄。
当前计划是将更改作为 3.5 版本的一部分进行,为使用 WebDriver 进行回放做准备。
特别感谢 @tourdedave 的编辑。