Selenium2 + Еще одна загрузка файла - PullRequest
0 голосов
/ 19 апреля 2011

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

Так что я пытался использовать идентификатор / имя и т.д., чтобы нажать, но безрезультатно.Я пробовал клики, подобные этим -

Commons.clickById(webDriver, "pickfiles")

Но на странице ничего не происходит.

Я также пробовал - выложенный здесь фрагмент кода, который использует функцию сценария java -

не могу нажать кнопку, которая открывает диалог прикрепления файла

, но безрезультатно.Я всегда сталкиваюсь с ошибкой, заявляющей -

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

Любое предложение?

Ответы [ 2 ]

0 голосов
/ 29 июля 2014

Прежде всего мне нужно было создать небольшой класс, чтобы узнать, какие окна были открыты, и вернуть их в виде словаря окон.

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», а не требуемое окно.

0 голосов
/ 20 апреля 2011

И получил решение с помощью 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}");

Надеюсь, это поможет другим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...