Можно ли в расширеных методах, которые передаются Selenium-y использов
#1
Отправлено 26 января 2010 - 16:23
написал свой метод который с помощью WIN API ставит фокус на поле, пишет туда текст, а потом нажимает на кнопку.
Чтоб отдебажить запускаю метод как Java appliaction, метод отрабатывает.
Затем Maven-ом собираю jar, в документе пишу какие методы вызывать.
Всё работает до того момента пока я не вызываю метод с API.
Почему то отрабатывать не хочет, делал логирование, в метод у меня 100% заходит
может проблема в чём то другом, может кто подскажет ?
#2
Отправлено 26 января 2010 - 17:31
А вы WIN API как вызываете? Используется ли вызов нативного кода?Использую Eclipse + Maven + Selenium
написал свой метод который с помощью WIN API ставит фокус на поле, пишет туда текст, а потом нажимает на кнопку.
Чтоб отдебажить запускаю метод как Java appliaction, метод отрабатывает.
Затем Maven-ом собираю jar, в документе пишу какие методы вызывать.
Всё работает до того момента пока я не вызываю метод с API.
Почему то отрабатывать не хочет, делал логирование, в метод у меня 100% заходит
может проблема в чём то другом, может кто подскажет ?
То есть, было бы неплохо, если бы вы код вызова WIN API из Java выложили.
#3
Отправлено 26 января 2010 - 21:49
Возможно, существует более простой способ решения проблемы.
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#4
Отправлено 27 января 2010 - 07:40
А вы WIN API как вызываете? Используется ли вызов нативного кода?
То есть, было бы неплохо, если бы вы код вызова WIN API из Java выложили.
Использую библиотеку JNA собственно говоря вот сам метод
public static Result ClickOnButton() { try { final User32 lib = (User32) Native.loadLibrary("user32",User32.class); // используем интерфейс User 32 в котором описаны вызываемые API функции final byte[] title = new byte[256]; WndEnumProc wndenumproc; // ищем родительское окно по титлам wndenumproc = new WndEnumProc() { public boolean callback(int hWnd, int lParam) { lib.GetWindowTextA(hWnd, title, 255); String s = new String(title).trim(); for (int i = 0; i < title.length; i++) title[i] = ' '; if (s.equals("File Upload")) { me_hwnd = hWnd; return false; } return true; } }; lib.EnumWindows(wndenumproc, 0); final List<Integer> descriptors = new ArrayList<Integer>(); ChldWndEnumProc chldwndenumproc; //ищем всех наследников главного окна chldwndenumproc = new ChldWndEnumProc() { public boolean callback(int hWnd, int lParam) { { lib.GetWindowTextA(hWnd, title, 255); String chld = new String(title).trim(); for (int i = 0; i < title.length; i++) title[i] = ' '; descriptors.add(hWnd); //загоняем hWnd в массис т.к некоторые насоледники не имеют Caption if (chld.equals(Open)) { Openbtn = hWnd; //кнопка Open return false; } return true; } } }; lib.EnumChildWindows(me_hwnd, chldwndenumproc, 0); // дальше всё понятно Filename = descriptors.get(11); // это у нас поле для вводf lib.SendMessageA(Filename, WM_SETFOCUS, 1, "0"); lib.SendMessageA(Filename, WM_SETTEXT, 0, MyStr); lib.SendMessageA(Filename, WM_KILLFOCUS, 1, "0"); lib.SendMessageA(Openbtn, WM_SETFOCUS, 1, "0"); lib.SendMessageA(Openbtn, BM_SETSTATE, 1, "0"); lib.PostMessageA(Openbtn, WM_KILLFOCUS, 1, 0); return new Result(null, Result.PASS); } catch (Exception e) { return new Result(e.getMessage() , Result.FAIL); }
#5
Отправлено 27 января 2010 - 07:46
Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.
дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом
#6
Отправлено 27 января 2010 - 10:13
В последней официальной версии, скажем, нет метода GetWindowTextA, да ещё и с первым параметром int вместо HWND --
https://jna.dev.java...amp;view=markup
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#7
Отправлено 27 января 2010 - 10:13
И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.
дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом
#8
Отправлено 27 января 2010 - 11:39
И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.
дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом
я пока трачу время на обучение и прокачку скилов по селениуму и Java
просто интерестно а можно ли использовать или нет.
поэтому используются вот такие извратные методы, как говорится тяжело в учении легко в бою
#9
Отправлено 27 января 2010 - 11:41
не скомпилиться, потому что нет User 32 интерфейсяА вы WIN API как вызываете? Используется ли вызов нативного кода?
То есть, было бы неплохо, если бы вы код вызова WIN API из Java выложили.
Использую библиотеку JNA собственно говоря вот сам методpublic static Result ClickOnButton() { try { final User32 lib = (User32) Native.loadLibrary("user32",User32.class); // используем интерфейс User 32 в котором описаны вызываемые API функции final byte[] title = new byte[256]; WndEnumProc wndenumproc; // ищем родительское окно по титлам wndenumproc = new WndEnumProc() { public boolean callback(int hWnd, int lParam) { lib.GetWindowTextA(hWnd, title, 255); String s = new String(title).trim(); for (int i = 0; i < title.length; i++) title[i] = ' '; if (s.equals("File Upload")) { me_hwnd = hWnd; return false; } return true; } }; lib.EnumWindows(wndenumproc, 0); final List<Integer> descriptors = new ArrayList<Integer>(); ChldWndEnumProc chldwndenumproc; //ищем всех наследников главного окна chldwndenumproc = new ChldWndEnumProc() { public boolean callback(int hWnd, int lParam) { { lib.GetWindowTextA(hWnd, title, 255); String chld = new String(title).trim(); for (int i = 0; i < title.length; i++) title[i] = ' '; descriptors.add(hWnd); //загоняем hWnd в массис т.к некоторые насоледники не имеют Caption if (chld.equals(Open)) { Openbtn = hWnd; //кнопка Open return false; } return true; } } }; lib.EnumChildWindows(me_hwnd, chldwndenumproc, 0); // дальше всё понятно Filename = descriptors.get(11); // это у нас поле для вводf lib.SendMessageA(Filename, WM_SETFOCUS, 1, "0"); lib.SendMessageA(Filename, WM_SETTEXT, 0, MyStr); lib.SendMessageA(Filename, WM_KILLFOCUS, 1, "0"); lib.SendMessageA(Openbtn, WM_SETFOCUS, 1, "0"); lib.SendMessageA(Openbtn, BM_SETSTATE, 1, "0"); lib.PostMessageA(Openbtn, WM_KILLFOCUS, 1, 0); return new Result(null, Result.PASS); } catch (Exception e) { return new Result(e.getMessage() , Result.FAIL); }
public interface User32 extends StdCallLibrary { boolean EnumChildWindows(int hWnd, ChldWndEnumProc chldwndenumproc, int lParam); boolean EnumWindows(WndEnumProc wndenumproc, int lParam); int GetWindowTextA(int hWnd, byte[] lpString, int nMaxCount); int SetWindowTextA(int hWnd, byte[] lpString); int SendMessageA(int hWnd, int msg, int wParam, String lParam); boolean PostMessageA(int hWnd, int msg, int wParam, int lParam); }
и ещё
public interface WndEnumProc extends StdCallLibrary.StdCallCallback { boolean callback(int hWnd, int lParam); }
и вот это
public interface ChldWndEnumProc extends StdCallLibrary.StdCallCallback { boolean callback(int hWnd, int lParam); }
#10
Отправлено 27 января 2010 - 12:09
Понятно. В принципе это полезно. Но я бы вам рекомендовал уделить внимание более полезным с точки зрения тестирования задачам. Например, потренируйтесь в работе с динамическими таблицами или с динамически подгружаемыми объектами, если таковые есть. С этим на практике сталкиваться приходится намного чаще. И навыки работы с подобным пригодятся куда больше, чем проверка стандартного функционала браузера (к тому же наверняка заточенного под конкретный браузер) методами, для которых селениум не предназначен.И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.
я пока трачу время на обучение и прокачку скилов по селениуму и Java
просто интерестно а можно ли использовать или нет.
поэтому используются вот такие извратные методы, как говорится тяжело в учении легко в бою
А так, вы прокачиваете скилы скорее в "изобретении костылей" для селениума.
#11
Отправлено 27 января 2010 - 13:52
Когда селениум делает click на поле ввода типа file, он блокируется до тех пор, пока диалог не будет закрыт.
Поэтому вызов метода ClickOnButton надо делать в параллельном потоке.
Вы делаете это или пытаетесь выполнять действия последовательно?
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#12
Отправлено 28 января 2010 - 08:49
Почитал ещё раз код, понял, что речь идёт о диалоге загрузки файла на сервер, и появилось предположение, почему оно у Вас скорее всего не работает.
Когда селениум делает click на поле ввода типа file, он блокируется до тех пор, пока диалог не будет закрыт.
Поэтому вызов метода ClickOnButton надо делать в параллельном потоке.
Вы делаете это или пытаетесь выполнять действия последовательно?
Фух :) вчера показали как дебажить это дело всё. Я разобрался почему у меня не работало :)
У меня использовался русский профайл FF и поэтому String NAMEWIN ="File Upload" в русском профайле и не находило
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных