Перейти к содержимому

Фотография

Можно ли в расширеных методах, которые передаются Selenium-y использов


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 26 января 2010 - 16:23

Использую Eclipse + Maven + Selenium
написал свой метод который с помощью WIN API ставит фокус на поле, пишет туда текст, а потом нажимает на кнопку.

Чтоб отдебажить запускаю метод как Java appliaction, метод отрабатывает.

Затем Maven-ом собираю jar, в документе пишу какие методы вызывать.
Всё работает до того момента пока я не вызываю метод с API.

Почему то отрабатывать не хочет, делал логирование, в метод у меня 100% заходит
может проблема в чём то другом, может кто подскажет ?
  • 0

#2 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 26 января 2010 - 17:31

Использую Eclipse + Maven + Selenium
написал свой метод который с помощью WIN API ставит фокус на поле, пишет туда текст, а потом нажимает на кнопку.

Чтоб отдебажить запускаю метод как Java appliaction, метод отрабатывает.

Затем Maven-ом собираю jar, в документе пишу какие методы вызывать.
Всё работает до того момента пока я не вызываю метод с API.

Почему то отрабатывать не хочет, делал логирование, в метод у меня 100% заходит
может проблема в чём то другом, может кто подскажет ?

А вы WIN API как вызываете? Используется ли вызов нативного кода?
То есть, было бы неплохо, если бы вы код вызова WIN API из Java выложили.
  • 0

#3 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 26 января 2010 - 21:49

Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#4 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 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);
		}

  • 0

#5 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 27 января 2010 - 07:46

Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.


дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом :sad:
  • 0

#6 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 27 января 2010 - 10:13

Хотел попробовать -- не скомпилировалось. Какую версию JNA используете? Может быть у вас какое-то собственное расширение используется?

В последней официальной версии, скажем, нет метода GetWindowTextA, да ещё и с первым параметром int вместо HWND --
https://jna.dev.java...amp;view=markup
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#7 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 27 января 2010 - 10:13

Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.


дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом :sad:

И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.
  • 0

#8 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 27 января 2010 - 11:39

Раскройте также секрет, зачем используется WIN API?
Возможно, существует более простой способ решения проблемы.


дело в том что Selenium не может обрабатывать модальные окна Windows , была поставлена задача методами Java реализовать чтоб в модальное окно вводился текст и нажималась кнопка. Селениум это не может делать.
код на Win API написан и он работает, но почему то не хочет дружить с селениумом :sad:

И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.


я пока трачу время на обучение и прокачку скилов по селениуму и Java
просто интерестно а можно ли использовать или нет.
поэтому используются вот такие извратные методы, как говорится тяжело в учении легко в бою
  • 0

#9 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 27 января 2010 - 11:41

А вы 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);
		}

не скомпилиться, потому что нет User 32 интерфейся

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);
}

  • 0

#10 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 27 января 2010 - 12:09

И вот это всё зверство только из-за проверки стандартного функционала стандартного контрола браузера? Если вы разрабатываете браузер, то да, это уместно, так как надо проверить, что поддерживается элемент данного типа. В остальном, достаточно проработать ввод полного пути к файлу. Вот тут в принципе можно поиграться с Win API (хотя я бы не стал), чтобы поймать нужное поле и ввести в него текст. А так вы тратите время на тестирование функционала, который наверняка не относится к функционалу именно тестируемого приложения.


я пока трачу время на обучение и прокачку скилов по селениуму и Java
просто интерестно а можно ли использовать или нет.
поэтому используются вот такие извратные методы, как говорится тяжело в учении легко в бою

Понятно. В принципе это полезно. Но я бы вам рекомендовал уделить внимание более полезным с точки зрения тестирования задачам. Например, потренируйтесь в работе с динамическими таблицами или с динамически подгружаемыми объектами, если таковые есть. С этим на практике сталкиваться приходится намного чаще. И навыки работы с подобным пригодятся куда больше, чем проверка стандартного функционала браузера (к тому же наверняка заточенного под конкретный браузер) методами, для которых селениум не предназначен.

А так, вы прокачиваете скилы скорее в "изобретении костылей" для селениума.
  • 0

#11 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 27 января 2010 - 13:52

Почитал ещё раз код, понял, что речь идёт о диалоге загрузки файла на сервер, и появилось предположение, почему оно у Вас скорее всего не работает.
Когда селениум делает click на поле ввода типа file, он блокируется до тех пор, пока диалог не будет закрыт.
Поэтому вызов метода ClickOnButton надо делать в параллельном потоке.
Вы делаете это или пытаетесь выполнять действия последовательно?
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#12 madboy4ik

madboy4ik

    Новый участник

  • Members
  • Pip
  • 62 сообщений
  • ФИО:Александр Александрович
  • Город:Kharkov

Отправлено 28 января 2010 - 08:49

Почитал ещё раз код, понял, что речь идёт о диалоге загрузки файла на сервер, и появилось предположение, почему оно у Вас скорее всего не работает.
Когда селениум делает click на поле ввода типа file, он блокируется до тех пор, пока диалог не будет закрыт.
Поэтому вызов метода ClickOnButton надо делать в параллельном потоке.
Вы делаете это или пытаетесь выполнять действия последовательно?


Фух :) вчера показали как дебажить это дело всё. Я разобрался почему у меня не работало :)
У меня использовался русский профайл FF и поэтому String NAMEWIN ="File Upload" в русском профайле и не находило :sad:
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных