用selenium打开windows文件对话框

时间:2015-12-09 15:42:53

标签: c# windows google-chrome selenium

我知道这个问题已经解决了很多,但我没有发现类似于我的问题,所以请告诉我是否有解决方案。

我正在使用selenium webdriver(chrome)和C#来测试Web应用程序。 在应用程序中,我有一个按钮,它打开一个Windows文件对话框,以便选择和上传文件。

我使用Click()单击按钮,SendKeys()将文件的路径粘贴到Windows对话框中并点击“Enter”。 我不是想用selenium来控制对话。 它在大多数情况下都是成功的,但是有时单击按钮时对话框不会打开,并且它似乎被冻结了几分钟(也无法手动单击按钮),但测试会恢复,就像对话框一样被打开了。 2-3分钟后,窗口对话框终于出现,但不用说整个测试都搞砸了。 这不是程序本身的问题,因为当手动执行点击时,问题永远不会发生。

可能是什么问题,我该如何解决? 请记住,我无法更改我正在测试的程序。

谢谢

3 个答案:

答案 0 :(得分:1)

您可以直接使用Microsoft UI Automation而不使用White。

没有TestStack White。没有意义将整个库用于一个窗口自动化。白色只是包装。

var FirefoxWindowElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty,"MozillaWindowClass"));
FirefoxWindowElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty,"#32770"))
//You can navigate directly to input field or just use the keyboard because input field is always focussed
SendKeys.SendWait("YOUR FILE PATH here");
Keyboard.Press(Key.Return);

答案 1 :(得分:0)

如果您创建等待对话框怎么办?

        public void waitForElement()
    {
        while(!yourDialogElement.Displayed)
        {

            yourButtonElement.Click()
            System.Threading.Thread.Sleep(1000) // sleep for 1000 milliseconds

        }
    }

您可能希望在该按钮单击中构建一个try / catch,并且可能在您的循环中构建一个计数器并传递超时限制。

让我知道这是否有效或者您是否需要更多帮助!

答案 2 :(得分:0)

您应该考虑在框架中添加一个名为WHITE的库。这类似于Selenium,但对于Win32应用程序,可以通过Microsoft UI Automation处理大多数类型的Windows对话框对象。

设置WHITE后,您可以在代码中添加一个方法,Selenium点击按钮打开对话框窗口。此方法可以轮询对话框的存在,并且如果在设定的时间之后窗口没有出现,则可能无法在那里进行测试,然后再尝试再次单击该按钮。

如果您确信它始终存在,您也可以无限期地轮询,直到窗口出现。我会设置一个上限自己,但到5分钟,或者你觉得这是什么,以防止某种无限循环情况。