Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Не удается развернуть свернутое окно десктоп приложения.

winium
java
Теги: #<Tag:0x00007fedb99cd7f0> #<Tag:0x00007fedb99cd390>

(Spiv) #1

Я использую Java+winium для написания автотестов(десктоп клиент), в ходе написания тестов завис на работе с окнами нескольких десктоп приложений.
Может ли Winium по className развернуть свернутую программу?
Можно ли переключиться с 1 программы на другую по средствам winium?


(Sergey Ivanskoy) #2

Здравствуйте.
Не знаю на счет 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)


(Artur Korobeynyk) #3

Ваш код минимизирует окно. Вы в метод ws_syscommand отправляете комманду минимизировать окно. Последний 0 ничего не значит здесь. Если код работает, то скорее всего благодаря SetForegroundWindow который возможно тоже восстанавливает окно (нужно почитать мсдн что немного лень)

Так что я бы строчку заменил на

    User32.INSTANCE.PostMessage(hWnd, WinUser.WM_SYSCOMMAND, WinUser.SC_RESTORE, 0);

(Sergey Ivanskoy) #4

Ну, здесь не суть - можно развернуть, можно свернуть, что вам будет угодно :slight_smile: Важна сама суть.


(Spiv) #5

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


(Spiv) #6

Реализовал так:
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 просто разворачивает окно приложения, но не дает системе фокус на него.


(Павел Сенин) #7

Работал java + java-обертка для autoit - точно нет проблем с фокусом и развертыванием окон. Если решения для winium не найдется, можно попробовать часть действий через autoit делать


(Sergey Ivanskoy) #8

к сожалению, не могу вам сказать на счет установки фокуса по ShowWindow, надо проверять. Вы можете воспользоваться SetFocus(hwnd) для его установки.


(Spiv) #9

Пробовал так:
public void windWork() {
hwnd = User32.INSTANCE.FindWindow(“className”, “name”);//тут данные программы
User32.INSTANCE.ShowWindow(hwnd,1);
User32.INSTANCE.SetFocus(hwnd);

Но фокус поймать не удалось, дальше сценарий не пошел. Попробую с autoit реализовать.


(Fiodar Motin) #10

Может не по месту, но небольшой пример под autoit

   @Test
    public void hideWindow(){
        autoItX.winMinimizeAll();
    }

    @Test
    public void closeWindow(){
        autoItX.winClose(appName);
    }

Если что есть небольшой демо проект на autoit https://github.com/tasks-delivery/front-editor/tree/master/src
Там не лучший пример, но все же этого достаточно


(Artur Korobeynyk) #11

Подождите, так согласно логу у вас вебдрайвер падает во время WebDriverWait потому что driver в этот момент Null. Вы по ходу статическую переменную драйверу обьявили, а вот инициализировать забыли.