WebDriver + AutoIt + Java - не вызывается скрипт

Всем привет.
Помогите разобраться начинающему …

Вобщем зарекордил небольшой скриптик на AutoIt для нажатия кнопок SaveAs и вставку имени файла…
Отдельным запуском скрипт работает как надо, вообще нет нареканий.
Хоть напрямую его запускать, хоть через командную строку (Win 10) хоть через Run (Win + R).

В тесте прописал такую строку для вызова этого скрипта:

@Test(testName = "Save ACR Report1")
    public void a1_openAcrRepPage() throws IOException, InterruptedException {
        webSite.reportAcr().enterCount(count1);
        webSite.reportAcr().addCount();
        webSite.reportAcr().clickSubmit();
        webSite.reportAcr().downloadReport();
        Thread.sleep(3000);
        Process myProcess = Runtime.getRuntime().exec("D:\\automation\\Reports\\ACR\\acr1.exe");
        myProcess.waitFor();
        webSite.permissionPage().clickLogout();
    }

И вот проблема в том, что вызов скрипта acr1.exe не происходит, драйвер просто зависает и все, диалоговое окно для сохранения файла открыто и висит нетронутым, и может висет очень долго.

Подскажите, в чем косяк ???

Попробуйте так вызвать приложение:
Runtime.getRuntime().exec(new String[]{"cmd", "/c", "\"D:\\automation\\Reports\\ACR\\acr1.exe\""});
И ваш вопрос абсолютно не относится к вебдрайверу.

Я не знаю всего контекста вашего приложения. Но можно попробовать selenide для даунлоада файла.
Там это очень удобно реализовано.

не помогло ((

А он сможет нажать на SaveAs и потом в откром диалоговом окне ввести нужное имя файла для сохранения и в случае если этот файл есть то подтвердить перезапись файла?

Selenide просто качает файл и выдает вам ссылку на него, т.е. объект типа File. А там делайте с ним что хотите.
Окно SaveAs - системное. С ним вам не нужно работать. Вы работаете с файлом.

Или с помощью некоторых манипуляций с опциями браузера, вы можете настроить старт вэбдрайвера так, чтоб он при каждом таком действии автоматом скачивал файл в указанную вами дерикторию с возможностью перезаписи. Примеры есть в сети.

Что-то в этом роде

есть еще проект гдe autoitxxx.dll зовется напрямую через jna:

. дайте пож-та детали вашего сценария попробовать

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

намного проще синхрнизировать java саму с собой как нибудь вот так (пример не полностью рабочий)


@BeforeMethod
	public void beforeMethod() {
		instance = AutoItX.getInstance();
	}
....
@Test(enabled = false)
	public void testCloseOpenFileDialog() {
		System.err.println("Close File Dialog");

		System.err.println("Provide Path to Save File");
		title = "Save";
		// customized to exercise shift modifier
		String filePath = "D:\\AutoIT-commands\\TestingV+i+d+e+o.mp4";
		instance.WinWaitActive(title, text);
		// will successfully send a shift key
		instance.Send(filePath, true);
		sleep(100);
		instance.Send("\n"); // "{ENTER}"
		result = instance.WinGetText(title, text);
		assertThat(result, notNullValue());

чем с exec

Вобщем, так и не нашел решения ((
После того как происходит клик на ссылку вот здесь

webSite.reportAcr().downloadReport();

появляется системное окно для сохранения файла, но до этого куска кода не доходит

Process myProcess = Runtime.getRuntime().exec("D:\\automation\\Reports\\ACR\\acr1.exe");
        myProcess.waitFor();

Тест падает с ошибкой:
Timed out waiting for page to load selenium

Есть какие то идеи почему так ?

Потому, как все таки драйвер дожидается, пока загрузится полностью отчет на странице и только потом нажимает на ссылку Download… и получается, что страница уже загружена, а что он еще ждет?

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

Сделал уже вот так:

    @Test(testName = "Save ACR Report1")
    public void a1_openAcrRepPage()  {
        webSite.reportAcr().enterCount(count1);
        webSite.reportAcr().addCount();
        webSite.reportAcr().clickSubmit();
        webSite.reportAcr().downloadReport();
        //webDriver.findElement(By.className("f2")).click();
    }

    @Test(testName = "saveAs")
    public void a2_clickSave_as() throws IOException {
        webSite.reportAcr().clickSaveAs();
        webSite.permissionPage().clickLogout();
    }

сам метод clickSaveAs()

public void clickSaveAs() throws IOException {

        Runtime.getRuntime().exec(new String[]{"cmd", "/c", "\"D:\\automation\\Reports\\ACR\\acr1.exe\""});
    }

Вот зависает на первом тесте, потом падает по таймауту первый
org.openqa.selenium.TimeoutException: Timed out waiting for page to load.

и второй выполняется нормально.

Возможно это еще что то подскажет:

  @BeforeTest
    public void setUp() throws InterruptedException {
        System.setProperty("webdriver.ie.driver","D:\\automation\\drivers_for_browsers\\IEDriverServer_x64_3.14.0\\IEDriverServer.exe");
        DesiredCapabilities caps = DesiredCapabilities.internetExplorer();
        caps.setCapability("ignoreZoomSetting",true);
        caps.setCapability("nativeEvents",false);
        //caps.setCapability(CapabilityType.PAGE_LOAD_STRATEGY,"eager");


        webDriver = new InternetExplorerDriver(caps);
        webDriver.manage().window().maximize();
        webSite = new LeisSite(webDriver);

Написал немного подробнее. Или еще что то не хватает?

имел в виду обычно браузеры конфигурируют чтобы молча загружалось а вам надо наоборот

вот вчера наваял POC с FF (знаю что FF умеет молча загружать но тюнить проект запускать IE не хватило времени вчера


AutoItX instance = AutoItX.getInstance();
FirefoxProfile profile = new FirefoxProfile();
// ...
capabilities.setCapability("marionette", false);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
driver = new FirefoxDriver(capabilities);
String directURL = "https://file-examples.com/wp-content/uploads/2017/02/zip_9MB.zip";
driver.navigate().to(directURL);
sleep(timeout);
title = "[ACTIVE]";
String windowTitle = instance.WinGetTitle(title, text);
assertThat(windowTitle, notNullValue());
System.err.println(
String.format("The active window title is \"%s\"", windowTitle));
// печатает The active window title is "Opening zip_9MB.zip"
sleep(100);
instance.Send("{DOWN}", true); // arrow key down
sleep(100);
instance.Send("{TAB}", true);
sleep(100);
instance.Send("{TAB}", true);
sleep(100);
instance.Send("{TAB}", true);
sleep(100);
instance.Send("{ENTER}", true);
sleep(10000);
result = instance.WinGetText(title, text);
// NOTE: Mozilla Firefox Download Manager dialog button does not return any
// text of interest
assertThat(result, notNullValue());
System.err.println(String.format("The result is \"%s\"", result));
// Downloaded file will be found in the default location, that is
// configurable through Mozilla Firefox profile e.g.
// $env:USERPROFILE:/Downloads
sleep(1000);


c IE сегодня напишу пример

1 лайк

а можно еще про этот момент рассказать, потому, как вроде начало доходить, что может и правда не надо с окнами этими работать, а втихаря скачал файл куда надо и там уже с ним работать …

этого добра полно в интернетах automated testing - How to download a file using Selenium's WebDriver? - Software Quality Assurance & Testing Stack Exchange
Blog technologiczny Archive - j‑labs

А можно вопрос.
Это для винды хорошо. А что вы будете делать с линукс, например, или маком?

ну если вдруг у нас появится линукс, то соответственно ИЕ там уже не будет и можно будет перейти на ФФ, а это уже снимет эту проблему автоматом, т.к. уже нарыл инфу о том, что ФФ можно переконфигурить и обойтись без этих окон для сохранения файла …

Мак вообще не рассматриваю, т.к. переход на его равен нулю … ))

добавь в скрипт AutoIt перезагрузку страницы