Selenium 测试停止在文件选择表单上执行

Selenium test stops executing on a file choosing form

我有一个网站,用户可以将他的照片发送到比赛中。他单击以从磁盘中选择文件并使用 Firefox 发送它。

我想在 C# 中使用 Selenium 测试我的表单。我知道有一种方法可以将本地文件路径发送到输入文件,但我想测试它,包括 Windows 7 个文件打开对话框。

我已经编写了测试,单击一个按钮打开文件对话框并执行此代码以在文件上传对话框中设置本地文件的路径:

System.Windows.Forms.SendKeys.SendWait(localFile);
Thread.Sleep(1500);
System.Windows.Forms.SendKeys.SendWait("{ENTER}");

当我在 Windows 上的个人资料上测试它时,它工作正常。但是我在 Windows 上有另一个配置文件,其中网站测试是 运行ning。所以我用我的个人资料来使用Windows,并在第二个资料上测试运行。当我将测试设置为在我的第二个配置文件上执行时,它没有正确执行。

当我切换到此配置文件时,我看到一个对话框 window,并且在我切换到配置文件的那一刻,本地文件 url 被输入到文件对话框中。当我在执行测试的配置文件中不活动时,SendWait 似乎不起作用。

所以我的问题是:如何使测试在配置文件上正确处理文件对话框我在执行测试时未处于活动状态?

假设您的意思是那些测试 运行 在同一台机器上的另一个帐户和另一个桌面上,那么问题很可能是由 SendInput 方式引起的(它是SendKeys 内部使用)有效 - 它似乎只在当前活动桌面上有效。

我无法从 MS 找到关于该部分的任何可靠文档,但这是合乎逻辑的 this answer(on a bit different question) says

it's heavily reliant on the underlying Win32 SendInput API. This won't work at all for keyboard input when a desktop is inactive.

或者可能是因为您的测试基础设施的设置方式(可能是非交互式服务 - https://blogs.msdn.microsoft.com/patricka/2010/04/27/what-is-interactive-services-detection-and-why-is-it-blinking-at-me/ 未绑定到任何桌面)。

如果 当前活动桌面 是原因,则备选方案是:

  1. 单独的测试机,可能是虚拟的(从这个和其他角度来看,这是最好的解决方案 - 应该努力不在自己的机器上测试任何东西)。
  2. 尝试 PostMessage - 这应该独立于活动的桌面问题 - 你有 window 处理 - 你 post 向它发送消息,尽管它可能会出现其他问题。
  3. 尝试 System.Windows.Automation 直接更改控件(据我所知,它不应该使用 SendInput 或类似的东西)。
  4. 键盘驱动程序 - 也许它可以克服这些问题,也许不能 - 应该研究一下。

基本上,在原生 Selenium 支持下,上传以更简单的方式工作:

  • 您应该找到元素 "input[type='file']
  • 调用 inputFileElement.SendKeys(fullPathToFile)

fullfilePath 可以是任何有效的windows 路径或网络共享