Прежде всего мне нужно было создать небольшой класс, чтобы узнать, какие окна были открыты, и вернуть их в виде словаря окон.
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», а не требуемое окно.