Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取在节点上执行的测试名称,以将windows凭据传递到windows vault以用于web应用登录_C#_Selenium_Selenium Webdriver_Selenium Grid - Fatal编程技术网

C# 获取在节点上执行的测试名称,以将windows凭据传递到windows vault以用于web应用登录

C# 获取在节点上执行的测试名称,以将windows凭据传递到windows vault以用于web应用登录,c#,selenium,selenium-webdriver,selenium-grid,C#,Selenium,Selenium Webdriver,Selenium Grid,很长的解释即将到来,但我希望提供的越多,就越有可能有人做过类似的事情 我目前正在开发一个测试解决方案,以测试使用windows凭据登录到应用程序的web应用程序(Visual Studio、C#、Seleno、MSTest)。这些凭据可以存储在windows vault中,可以将internet选项设置为自动登录,也可以将其输入警报框。大多数测试使用不同的用户,因为他们在应用程序中拥有不同的权限 警报框不是标准的javascript警报,而是由浏览器屏蔽的windows提示。 我一直在通过我的自

很长的解释即将到来,但我希望提供的越多,就越有可能有人做过类似的事情

我目前正在开发一个测试解决方案,以测试使用windows凭据登录到应用程序的web应用程序(Visual Studio、C#、Seleno、MSTest)。这些凭据可以存储在windows vault中,可以将internet选项设置为自动登录,也可以将其输入警报框。大多数测试使用不同的用户,因为他们在应用程序中拥有不同的权限

警报框不是标准的javascript警报,而是由浏览器屏蔽的windows提示。 我一直在通过我的自动化解决方案处理这个问题,将凭据推送到windows vault中,并配置internet选项,以便使用当前用户名和密码自动登录,但最近我实施了Selenium Grid,以便作为CI管道的一部分运行并行测试,而不是使用Microsoft test的分布式方法经理

听起来很简单,但事实并非如此

以前使用MTM时,DLL被分发到每个测试代理,并由测试控制器进行管理。我们有一个类,它将凭据推送到windows vault中,以便为每台机器工作。 通过栅格,这些将被推入到主计算机vault中,而不是节点中。我曾计划使用PowerShell在节点上添加凭据,因为这需要在创建浏览器实例之前进行,但selenium grid没有告诉用户它正在哪些节点上执行测试

我尝试使用selenium与警报交互,但当导航到应用程序时,页面会不断加载,直到输入凭据,因此selenium GoTour()方法会陷入循环。如果使用超时停止该方法,警报将消失。(可以通过按浏览器中的X按钮停止页面加载来手动重新创建)

我改变了方法,并使用RemoteWebDriver的SessionID向SeleniumHub发送了一个rest请求,以获取所有正在执行测试的机器的主机名。现在我有了节点,可以使用远程PowerShell更新凭据存储。正如我在开始时所说的,大多数测试都使用不同的用户,所以我也需要网格来告诉我哪个测试也在主机上执行,但我找不到一种方法让网格中心告诉我它正在以编程方式运行哪些测试

简言之,我想:

从Selenium网格获取当前测试会话的节点

获取每个节点上运行的测试名称

一旦我有了这两个,我就可以通过远程PowerShell发送适当的用户详细信息

如果有人做过类似的事情或有任何建议,我们将不胜感激

谢谢

G

从Selenium网格获取当前测试会话的节点

要查找测试路由到的节点,可以执行以下操作:

  • 使用
    driver.getSessionId()
    创建新的
    RemoteWebDriver
    实例后检索当前会话id(这是我在Java中的操作方式)
  • 一旦您有了会话id,就可以发布到端点
    http://localhost:4444/grid/api/testsession?session=
    并从响应负载中提取节点的远程主机和端口号
你可以在我的博客文章中了解更多

获取每个节点上运行的测试名称


我不确定您在这里指的是什么测试名称。在Selenium网格世界中没有测试名称的概念。这一切归结为一个会话id,它指示/表示正在运行的测试。

有什么原因不能将所有凭据都推送到每个VM上的Windows vault中?一旦这样做了,你就不必再担心他们,除非你添加或更新帐户。这也是我的第一个想法。vault中的特定服务器只能有一个凭据。因此,如果您尝试添加2,第一个将被添加,然后被第二个覆盖您是否尝试过使用C#从内部编程创建凭据,比如@BeforeTest(而不是使用PowerShell远程推送它们)?看,我也试过了,但代码仍然在主节点而不是节点上执行。提出了一种使用REST请求、上下文管理器和远程PowerShell的方法当我说测试名称时,我的意思是说测试方法名称。我昨天想出了一个解决办法,和你一样。使用会话ID获取节点一旦我有了节点,我就使用我创建的测试上下文管理器来标识正在执行的测试和需要的凭据。然后,我通过Powershell将其传递给节点,后者添加了凭据并清除了浏览器缓存,以防止需要创建新实例来识别已添加的凭据并刷新登录的浏览器