【问题标题】:Closing windows in selenium multi-window test在硒多窗口测试中关闭窗口
【发布时间】:2018-07-23 13:31:34
【问题描述】:

我目前正在处理一个需要使用多个窗口的项目,每个窗口都需要不同的会话和 cookie。

每个窗口创建完成并完成工作后,都需要关闭它。然后重复这个过程。

窗口创建在一个数组中,如图所示。

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] .....

关闭窗户的最佳方法是什么: 使用 driver[index].close() 或 driver[index].quit()

我在使用 driver[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] 文件夹,这些文件夹来自未删除的会话。

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

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

【问题讨论】:

  • 多个窗口意味着多个浏览器选项卡或多个浏览器实例(具有单个选项卡)? .此外,仅当我在同一个浏览器实例中打开多个选项卡并想要关闭当前处于活动状态的选项卡时,我才会使用 driver.close() 方法。而 driver.quit() 将用于终止整个浏览器实例。还有一件事,过去也有 'driver.dispose()' 方法,除了安全结束会话之外,它与 driver.quit() 有点相同。

标签: node.js selenium session selenium-webdriver geckodriver


【解决方案1】:

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

driver[index].close()

分析

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

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

geckodriver 依次向 marionette 发送 "quit" 信号和 "eForceQuit" 标志,如下所示:

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 会将 DELETE 发送到 geckodriver::marionette em> 仅针对特定会话窗口如下:

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 / TAB 将不受影响。


更新

如果您仔细观察 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"

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

你可以在_Is it Firefox or Geckodriver, which creates “rust_mozprofile” directory_找到关于_“rust_mozprofile”_目录的详细讨论

【讨论】:

  • 关于生成的临时文件夹有没有办法避免它们?我发现使用 close()quit() 自动删除相应的 rust_moz 文件夹,而 tmp-[] 文件夹 保持未删除:尤其是在使用自定义 Firefox 配置文件时,请参阅我更新的代码。
  • 根据您的评论添加了我的答案的更新。如果您还有其他反问题,请告诉我。
  • 谢谢我如何打开壁虎驱动程序的跟踪日志,还没有找到Selenium JS的教程+在哪里可以找到日志
  • 您能否针对您的新要求提出一个新问题:)
  • :) here
猜你喜欢
  • 2015-08-17
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多