Selenium2 +又一个文件上传

时间:2011-04-19 05:30:02

标签: c# webdriver selenium-webdriver

嗯,我知道selenium世界充满了文件上传线程,这是我今天遇到的并且到目前为止还无法解决的问题。虽然通过使用FF浏览器输入文件上传的文件输入文本框,已经解决了这些问题。

首先,没有文件输入框。它只是一个按钮,弹出选择文件,一旦你选择文件,上传开始自己开启。 html看起来像 -

<div id="container" style="position: relative;">
       <div id="filelist"></div>
      <br>
        <a id="pickfiles">
        <input type="button" name="Photos" value="Pick a File"></a>
        <div id="p15tlsibt1185d1pi41tbd16c31a0n0_flash_container" style="position: absolute; top: 21px; background: none repeat scroll 0% 0% transparent; z-index: 99999; width: 86px; height: 18px; left: 0px;" class="plupload flash"><object width="100%" height="100%" data="/CKFinder/upload/content/runtimes/plupload.flash.swf" type="application/x-shockwave-flash" style="outline: 0pt none; background-color: transparent;" id="p15tlsibt1185d1pi41tbd16c31a0n0_flash"><param value="/CKFinder/upload/content/runtimes/plupload.flash.swf" name="movie"><param value="id=p15tlsibt1185d1pi41tbd16c31a0n0" name="flashvars"><param value="transparent" name="wmode"><param value="always" name="allowscriptaccess"></object></div></div>

所以我尝试使用id / name等来点击但无济于事。我试过像这样的点击 -

Commons.clickById(webDriver, "pickfiles")

但页面上没有任何反应。

我也尝试过 - 这里发布的代码片段使用了java脚本exectuion -

cant click button which opens file attachment dialog

但无济于事。我总是遇到错误陈述 -

System.InvalidOperationException : arguments[0].click is not a function (UnexpectedJavaScriptError)

有任何建议吗?

2 个答案:

答案 0 :(得分:0)

使用autoit获得解决方案,这是示例脚本 -

AutoItX3Lib.AutoItX3 au3 = new AutoItX3Lib.AutoItX3();
au3.WinWait("Select file to upload");
au3.WinActivate("Select file to upload");
au3.Send("C:\\Documents and Settings\\user\\Desktop\\area51.png");
au3.Send("{ENTER}");

我希望它有助于其他人

答案 1 :(得分:0)

首先,我必须创建一个小类来找出哪些窗口是打开的,并将它们作为窗口字典返回。

public static IDictionary<string, IntPtr> GetOpenWindows()
{
    IntPtr lShellWindow = GetShellWindow();
    Dictionary<string, IntPtr> lWindows = new Dictionary<string, IntPtr>();
    EnumWindows(delegate(IntPtr hWnd, int lParam)
    {
        if (hWnd == lShellWindow) return true;
        if (!IsWindowVisible(hWnd)) return true;
        int lLength = GetWindowTextLength(hWnd);
        if (lLength == 0) return true;

        StringBuilder lBuilder = new StringBuilder(lLength);
        GetWindowText(hWnd, lBuilder, lLength + 1);
        lWindows[lBuilder.ToString()] = hWnd;
        return true;
    }, 0);

    return lWindows;
}

public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

[DllImport("USER32.DLL")]
public static extern bool EnumWindows(EnumDelegate enumFunc, int lParam);

[DllImport("USER32.DLL")]
public static extern IntPtr GetShellWindow();

[DllImport("USER32.DLL")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("USER32.DLL")]
public static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("USER32.DLL")]
public static extern bool IsWindowVisible(IntPtr hWnd);

[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

在Selenium页面代码中,我点击按钮启动下载窗口并等待一段时间。 (这未在代码中显示)

然后我使用下面的代码查找所有打开的窗口

IDictionary<string, IntPtr> getOpenWindows = GetOpenWindows();

切换到下载窗口(不同浏览器的窗口名称不同。请注意!)

IntPtr hWnd = getOpenWindows["File Upload"];
SetForegroundWindow(hWnd);

输入文件的路径

SendKeys.SendWait(filename);

按Enter键

SendKeys.SendWait(@"{Enter}");

下载窗口应该关闭,所以我们切换回浏览器窗口(在这种情况下是Firefox)

hWnd = getOpenWindows["Mozilla Firefox"];
SetForegroundWindow(hWnd);

由于窗口标题因使用的浏览器而异,因此存在一些问题,因此需要考虑完整的解决方案。此外,当执行此部分代码时,不要将任何其他窗口带到前台,因为此窗口将接收“SendKeys”而不是所需的窗口。