在 selenium multi-window 测试中关闭 windows

Closing windows in selenium multi-window test

我目前正在从事一个需要使用多个 windows 的项目,每个都需要不同的会话和 cookie。

每个 window 创建并完成其工作后,需要将其关闭。然后重复这个过程。

windows 创建在数组中,如图所示。

var fOptions = new firefox.Options();
var profile = new firefox.Profile('./fProfile');
fOptions.setProfile(profile);    
driver[0] = new Builder().withCapabilities({'browserName': 'firefox'}).setFirefoxOptions(fOptions).build();
driver[1] .....

关闭 windows 的最佳方法是什么: 使用驱动程序 [index].close() 或驱动程序[index].quit()

我有时 运行 在使用 驱动程序 [index].quit() 时出现此错误 This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.

而且我的 TEMP 目录中还有很多 tmp-[abcd] 文件夹,我是从未删除的会话中猜测的。

我愿意接受任何在多重 window 测试中实现新会话的解决方案

我正在使用带有 gecko 驱动程序的 Selenium 的 nodeJS 实现。

当您在数组中创建 windows 时,关闭 windows 的最佳方法是使用 :

driver[index].close()

分析

当您调用 quit() 时,webdriver::server 发送 DELETE geckodriver::marionette 整个会话如下:

webdriver::server   DEBUG   -> DELETE /session/f84dbafc-4166-4a08-afd3-79b98bad1470 

geckodriver 依次发送 "quit" 信号和 "eForceQuit" 标志到 marionette 如下:

geckodriver::marionette TRACE   -> 37:[0,3,"quit",{"flags":["eForceQuit"]}]

marionette 最终生成 Marionette 将不再接受任何进一步连接的日志"shutdown" 如下:

1518532363988   Marionette  DEBUG   New connections will no longer be accepted
1518532364053   Marionette  TRACE   0 <- [1,3,null,{"cause":"shutdown"}]
1518532364088   geckodriver::marionette TRACE   <- [1,3,null,{"cause":"shutdown"}]
1518532364089   webdriver::server   DEBUG   Deleting session
1518532364089   geckodriver::marionette DEBUG   Stopping browser process
1518532364519   webdriver::server   DEBUG   <- 200 OK {"value": {}}

虽然您的驱动程序实例已编入索引,但由于 Marionette 停止接受连接,因此您会观察到以下错误:

This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.

相反,如果您调用 close()webdriver::server 会发送 DELETEgeckodriver::marionette 仅如下所示:

1518532935982   webdriver::server   DEBUG   -> DELETE /session/3694b8b7-89b1-4249-a710-0915ad2e867e/window 
1518532935983   geckodriver::marionette TRACE   -> 16:[0,4,"close",{}]
1518532935985   Marionette  TRACE   0 -> [0,4,"close",{}]   

因此其他 Windows / TABs 将不受影响。


更新

如果您仔细观察 GeckoDriver 日志,很明显 Marionette 挖出一个新的 moz:profile在创建新会话时,如下所示:

1518532230009   mozrunner::runner   INFO    Running command: "C:\Program Files\Mozilla Firefox\firefox.exe" "-marionette" "-profile" "C:\Users\user_name\AppData\Local\Temp\rust_mozprofile.TxhOyDz3ozxL"

这个 activity 由 WebDriver 实例管理和处理,即 GeckoDriver 。自从我们从 Legacy Firefox 迁移到基于 Marionette 的 Firefox 以来,这个工作流就在实践中,这些叠加在 临时目录。到目前为止,我没有看到 GeckoDriverTest Execution 结束时清理杂务。因此,清理 rust_moz folders 的解决方案是定期使用 运行 CCleaner 工具,至少在执行 测试套件 之前和之后。

您可以在

中的 _“rust_mozprofile”_ 目录中找到详细讨论