PlUpload ウィジェットでも同様の問題がありました。私を正しい軌道に乗せてくれた CheryJose に感謝します。
まず、開いているウィンドウを見つけてウィンドウの辞書として返す小さなクラスを作成する必要がありました。
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 ページ コードで、ボタンをクリックして PlUpload ウィンドウを起動し、少し待ちます。(これはコードには示されていません)
次に、以下のコードを使用して、開いているすべてのウィンドウを見つけます
IDictionary<string, IntPtr> getOpenWindows = GetOpenWindows();
PlUpload ウィンドウに切り替えます (ウィンドウの名前はブラウザーによって異なります。注意してください!)
IntPtr hWnd = getOpenWindows["File Upload"];
SetForegroundWindow(hWnd);
ファイルのパスを入力します
SendKeys.SendWait(filename);
Enterキーを押します
SendKeys.SendWait(@"{Enter}");
PlUpload ウィンドウが閉じるので、ブラウザ ウィンドウ (この場合は Firefox) に戻ります。
hWnd = getOpenWindows["Mozilla Firefox"];
SetForegroundWindow(hWnd);
使用しているブラウザーによってウィンドウのタイトルが異なるため、これにはいくつかの問題があります。完全な解決策を得るには、これを考慮する必要があります。さらに、コードのこのセクションが実行されているときは、他のウィンドウを前面に表示しないでください。このウィンドウは、必要なウィンドウではなく「SendKeys」を受け取るためです。