У меня была аналогичная проблема с виджетом 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);
нажмите Ввод
SendKeys.SendWait(@"{Enter}");
Окно PlUpload закроется, поэтому мы вернемся в окно браузера (в данном случае Firefox).
hWnd = getOpenWindows["Mozilla Firefox"];
SetForegroundWindow(hWnd);
С этим возникает несколько проблем, поскольку заголовки окон различаются в зависимости от используемого браузера, поэтому это необходимо учитывать для полного решения. Кроме того, когда выполняется этот раздел кода, не выводите другие окна на передний план, так как это окно получит «SendKeys», а не требуемое окно.
person
Gazen Ganados
schedule
29.07.2014