Я использую Java+winium для написания автотестов(десктоп клиент), в ходе написания тестов завис на работе с окнами нескольких десктоп приложений.
Может ли Winium по className развернуть свернутую программу?
Можно ли переключиться с 1 программы на другую по средствам winium?
Здравствуйте.
Не знаю на счет winium, но можно использовать Win32API биндинг для жабы - либа jna.
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;
HWND hwnd = User32.INSTANCE.FindWindow("classname", "windowname");
User32.INSTANCE.PostMessage(hWnd, WinUser.WM_SYSCOMMAND, WinUser.SC_MINIMIZE, 0);
и
User32.INSTANCE.SetForegroundWindow(hWnd)
Ваш код минимизирует окно. Вы в метод ws_syscommand отправляете комманду минимизировать окно. Последний 0 ничего не значит здесь. Если код работает, то скорее всего благодаря SetForegroundWindow который возможно тоже восстанавливает окно (нужно почитать мсдн что немного лень)
Так что я бы строчку заменил на
User32.INSTANCE.PostMessage(hWnd, WinUser.WM_SYSCOMMAND, WinUser.SC_RESTORE, 0);
Ну, здесь не суть - можно развернуть, можно свернуть, что вам будет угодно Важна сама суть.
SC_RESTORE, у меня нет, но есть SW_RESTORE.
При попытке компиляции (c SW_RESTORE аналогично)
“User32.INSTANCE.PostMessage(hWnd, WinUser.WM_SYSCOMMAND, WinUser.SC_MINIMIZE, 0);”
Java ругается на преобразование инта :
Error:(16, 73) java: incompatible types: int cannot be converted to com.sun.jna.platform.win32.WinDef.WPARAM
Реализовал так:
public class Window {
static WebDriver driver;
static WebElement element;
@Test
public void windWork(){
HWND hwnd = User32.INSTANCE.FindWindow(null , Имя программы);
User32.INSTANCE.ShowWindow(hwnd,1);
}
@Test
public void Steps(){
element = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.name(“Меню”)));
element.click();
}
}
Но после метода windWork, тест падает в ошибку:
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:882)
at org.openqa.selenium.support.ui.FluentWait.(FluentWait.java:104)
at org.openqa.selenium.support.ui.WebDriverWait.(WebDriverWait.java:71)
at org.openqa.selenium.support.ui.WebDriverWait.(WebDriverWait.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Если я все правильно понимаю, функция ShowWindow просто разворачивает окно приложения, но не дает системе фокус на него.
Работал java + java-обертка для autoit - точно нет проблем с фокусом и развертыванием окон. Если решения для winium не найдется, можно попробовать часть действий через autoit делать
к сожалению, не могу вам сказать на счет установки фокуса по ShowWindow, надо проверять. Вы можете воспользоваться SetFocus(hwnd) для его установки.
Пробовал так:
public void windWork() {
hwnd = User32.INSTANCE.FindWindow(“className”, “name”);//тут данные программы
User32.INSTANCE.ShowWindow(hwnd,1);
User32.INSTANCE.SetFocus(hwnd);
Но фокус поймать не удалось, дальше сценарий не пошел. Попробую с autoit реализовать.
Может не по месту, но небольшой пример под autoit
@Test
public void hideWindow(){
autoItX.winMinimizeAll();
}
@Test
public void closeWindow(){
autoItX.winClose(appName);
}
Если что есть небольшой демо проект на autoit front-editor/src at master · tasks-delivery/front-editor · GitHub
Там не лучший пример, но все же этого достаточно
Подождите, так согласно логу у вас вебдрайвер падает во время WebDriverWait потому что driver в этот момент Null. Вы по ходу статическую переменную драйверу обьявили, а вот инициализировать забыли.