admin

Апр 092017
 

В PHP CURL POST руководство, Мы будем объяснять как использовать HTTP GET / POST запросы с PHP CURL library.

В данной статье ниже мы приводим примеры работы с данным протоколом

1) Отправить HTTP GET Запрос с CURL

2) Отправить HTTP POST Запрос с CURL

3) Отправить Random User-Agent в Запросе

4) Обработка перенаправление redirects ( HTTP 301, 302 )

5) Ошибки обработки ( Handle Errors ).

Почему мы используем PHP CURL ?

Отправить HTTP GET запрос, простой способ использовать метод file_get_contents().

file_get_contents('http://it.w-develop.com')

Но для использования POST запроса и использовать Обработчик ошибок не так просто в месте с командой file_get_contents().

Отправить HTTP запрос очень просто с PHP CURL. Вам надо выполнить четыре шага для отправки запроса

Шаг 1). Инициализация CURL сессии
Шаг 2). Заполняем options для CURL сессии
curl_setopt( $ch, CURLOPT_URL, "http://it.w-develop.com" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//curl_setopt( $ch, CURLOPT_HEADER, true ); // Если вы хотите использовать заголовки

CURLOPT_URL -> URL для загружки
CURLOPT_HEADER -> добавляем header/not
CURLOPT_RETURNTRANSFER -> если true, информация вернется как строка, а не выводит ее.

Полный список опций, смотри в документации PHP Documentation.

Шаг 3). Загружаем CURL сессию.
$output=curl_exec($ch);
Шаг 4). Зарываем сессию
curl_close($ch);
Note: Вы можете проверить, включен CURL enabled/not со следующим кодом.
if( is_callable( 'curl_init' ) ){
   echo "Enabled";
} else {
   echo "Not enabled";
}

1.PHP CURL GET Пример
You can use the below code to send GET request.

function httpGet( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//  curl_setopt( $ch, CURLOPT_HEADER, false ); 
 
    $output=curl_exec( $ch );
 
    curl_close( $ch );

    return $output;

}
 
echo httpGet("http://it.w-develop.com");

2.PHP CURL POST Пример
You can use the below code to submit form using PHP CURL.

function httpPost( $url, $params ) {

   $postData = '';
   //create name value pairs seperated by &
   foreach( $params as $k => $v ) {
      $postData .= $k . '='.$v.'&';
   }
   $postData = rtrim( $postData, '&' );
 
   $ch = curl_init();
 
   curl_setopt( $ch, CURLOPT_URL,$url );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER,true );
   curl_setopt( $ch, CURLOPT_HEADER, false );
   curl_setopt( $ch, CURLOPT_POST, count($postData ) );
   curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData );
 
   $output = curl_exec( $ch );
 
   curl_close( $ch );

   return $output;
 
}

How to use the function:

$params = array(
   "name" => "Ravishanker Kusuma",
   "age" => "32",
   "location" => "India"
);
 
echo httpPost( "http://it.w-develop.com/examples/php/curl-examples/post.php", $params );

3.SEND RANDOM USER-AGENT IN THE REQUESTS
You can use the below function to get Random User-Agent.

function getRandomUserAgent() {
    $userAgents=array(
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
        "Opera/9.20 (Windows NT 6.0; U; en)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50",
        "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.7) Gecko/20040624 Firefox/0.9",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/48 (like Gecko) Safari/48"       
    );
    $random = rand(0,count($userAgents)-1);
 
    return $userAgents[$random];

}

Используется CURLOPT_USERAGENT, Вы можете установить User-Agent string.

curl_setopt( $ch, CURLOPT_USERAGENT, getRandomUserAgent()) ;

4. HANDLE REDIRECTS (HTTP 301,302)
Обрабатывать URL redirects, set CURLOPT_FOLLOWLOCATION to TRUE.Максимальное количество переадресаций можно контролировать, используя CURLOPT_MAXREDIRS.

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch,CURLOPT_MAXREDIRS,2);//only 2 redirects

5. КАК ОБРАТИТЬ ОШИБКИ CURL
мы можем использовать методы curl_errno(), curl_error(), Чтобы получить последние ошибки для текущего сеанса.
curl_error( $ch ) -> returns error as string
curl_errno( $ch ) -> returns error number

Вы можете использовать приведенный ниже код для обработки ошибок.

function httpGetWithErros( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
    $output=curl_exec( $ch );
 
    if ( $output === false ) {

        echo "Error Number:" . curl_errno( $ch ) . "
"; echo "Error String:" . curl_error( $ch ); } curl_close($ch); return $output; }

Вывод полного списока ошибок, refer CURL errors

Мар 222016
 

Термопринтер Через COM Linux, Unix, Debian, Ubuntu, CentOS

Первоначально, надо, что бы Ваш Unix определил COM порт к которому мы подключили принтер.

Проверить можно это командой:

lsusb
ls /dev

Внимательно читаем документация к принтеру, и там должны быть похожие команды.

После пытаемся отправлять текст:

echo -ne "Проверяем как же работает текстовка\n" > /dev/ttyUSB0

Частичная обрезка:

echo -ne $'\x1B\x6D' > /dev/ttyUSB0

Полная обрезка:

echo -ne $'\x1B\x69' > /dev/ttyUSB0

Остальные команды смотрите в документации, они вводятся аналогично.

Мар 192016
 

Hibernate: основные типы данных

Hibernate предоставляет ряд готовых решений для привязки и приведения типов данных языка программирования к типам данных SQL. Такой процесс преобразования в Hibernate основан на использовании интерфейса org.hibernate.type.Type, а точнее его конкретных реализаций.

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

Типы данных в Hibernate разделены на 3 категории: основные типы, составные типы и типы коллекций. В этой статье речь пойдет только об основных типах данных, которые используются для отображения одного поля в БД. Эти типы удовлетворяют большинству потребностей приложения, обеспечивая связь между основными типами Java и распространенными типами SQL.

Основные встроенные типы данных:

Java Class Hibernate Class (org.hibernate.type) Hibernate тип Возможный тип данных SQL¹
¹ Конечный тип зависит от производителя БД
java.lang.String StringType string VARCHAR
(или Oracle VARCHAR2)
MaterializedClob materialized_clob CLOB
TextType text LONGVARCHAR (или TEXT)
java.lang.Character
(or char primitive)
CharacterType char CHAR
java.lang.Boolean
(or boolean primitive)
BooleanType boolean BIT
NumericBooleanType numeric_boolean INTEGER
(0 = false, 1 = true)
YesNoType yes_no CHAR
(‘N’ = false, ‘Y’ = true)
TrueFalseType true_false CHAR
(‘F’ = false, ‘T’ = true)
java.lang.Byte
(or byte primitive)
ByteType byte TINYINT
java.lang.Short
(or short primitive)
ShortType short SMALLINT
java.lang.Integer
(or int primitive)
IntegerType int
integer
INTEGER
java.lang.Long
(or long primitive)
LongType long BIGINT
java.lang.Float
(or float primitive)
FloatType float FLOAT
java.lang.Double
(or double primitive)
DoubleType double DOUBLE
java.math.BigInteger BigIntegerType big_integer NUMERIC
(или Oracle NUMBER)
java.math.BigDecimal BigDecimalType big_decimal NUMERIC
(или Oracle NUMBER)
java.util.Date
java.sql.Timestamp
TimestampType timestamp TIMESTAMP
java.sql.Time TimeType time TIME
java.sql.Date DateType date DATE
java.util.Calendar CalendarType calendar TIMESTAMP
java.util.Calendar CalendarType calendar TIMESTAMP
CalendarDateType calendar_date DATE
java.util.Currency CurrencyType currency VARCHAR
(или Oracle VARCHAR2)
java.util.Locale LocaleType locale VARCHAR
(или Oracle VARCHAR2)
java.util.TimeZone TimeZoneType timezone VARCHAR
(или Oracle VARCHAR2)
java.net.URL UrlType url VARCHAR
(или Oracle VARCHAR2)
java.lang.Class ClassType class VARCHAR
(или Oracle VARCHAR2)
java.sql.Blob BlobType blob BLOB
java.sql.Clob ClobType сlob СLOB
byte[] BinaryType binary (или byte[]) VARBINARY
MaterializedBlobType materialized_blob BLOB
ImageType image LONGVARBINARY
Byte[] WrapperBinaryType wrapper-binary (или Byte[]) VARBINARY
char[] CharArrayType characters (или char[]) VARCHAR
(или Oracle VARCHAR2)
Character[] CharacterArrayType wrapper-characters (или Character[]) VARCHAR
(или Oracle VARCHAR2)
java.util.UUID UUIDBinaryType uuid-binary BINARY
UUIDCharType uuid-char CHAR (или VARCHAR для существующих колонок)
PostgresUUIDType pg-uuid PostgreSQL UUID
java.io.Serializable SerializableType serializable(или имя класса реализующего интерфейс Serializable) VARBINARY

Типы blob и clob не всегда удобны для использования в приложении, потому как эти объекты не могут быть переиспользованы за пределами транзакции. Их альтернативой могут послужить materialized_blob и materialized_clob, эти типы сразу воссоздаются как байтовый массив и строка соответственно, и доступны вне транзакции.

За исключением коллекций, все встроенные типы Hibernate поддерживают null семантику. Уникальные идентификаторы и коллекции могут быть любым из этих типов данных, за исключением binary, blob и clob.

Использование Hibernate типов

Сразу хочу сказать, что для типов данных Java указывать Hibernate типы совсем не обязательно, в этом случае Hibernate подберет и назначит их самостоятельно. Но при использовании типов данных, которые могут быть сопоставлены более чем с одним Hibernate типом, лучше задавать их явно. Например, если свойство имеет тип java.lang.String, то по умолчанию Hibernate промаппит его типом «string». Это означает, что Вы должны явно определить Hibernate тип для свойства, если хотите отобразить строку как «text» или «materialized_clob».

Для определения Hibernate типа используется атрибут type при маппинге с помощью xml файла. Атрибут type может указываться в любых элементах, таких как <id>, <property>, <discriminator>, <index>, или <element>:

<hibernate-mapping>
<class name="User" table="USER">

<id name="id" column="ID" type="long">
<generator class="native"/>
</id>

<property name="birthdate" column="BIRTHDATE" type="timestamp"/>
</class>
</hibernate-mapping>

В случае маппинга с помощью аннотаций используется аннотация

org.hibernate.annotations.Type:

@Type(type = "yes_no")
private boolean newModel;

@Type(type = "text")
private String description;

Если же набора базовых типов не достаточно для реализации задач, Вы всегда можете написать свои собственные типы и назначить собственные стратегии преобразования. Но об этом в следующих статьях.

Мар 192016
 

BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности

BrowserMob Proxy это бесплатная утилита, которая позволяет собирать данные о производительности веб-сайтов и браузеров. Обычно используется вместе с инструментальными средствами автоматизации, такими как Selenium или Watir. Proxy позволяет управлять поведением браузера, имитировать сетевой трафик и задержки, изменять HTTP запросы и ответы. К востребованной функциональности также можно отнести использование «черного» и «белого» списков, что позволяет, например, блокировать загрузку сторонних сайтов, не относящихся к тестированию Вашего веб-приложения, и тем самым повысить скорость тестов.
Также довольно часто BrowserMob используется для автоматизации доступа к сайтам, требующим Basic авторизацию.

Управлять прокси-сервером можно напрямую через Java интерфейс или через REST API. В этой статье мы будем рассматривать только интересующий нас Java интерфейс. Для того, чтобы подключить BrowserMob в проект нужно скачать библиотеку и добавить ее в проект, либо добавить соответствующую зависимость в pom.xml, если вы используете Maven:


			net.lightbody.bmp
			browsermob-proxy
			2.0-beta-8
			test
		

Если у Вас уже имеется подключенная в проект библиотека Selenium, то лучше исключить использование Selenium API, встроенного в BrowserMob. Но при этом учитывайте возможные несоответствия версий Selemium и BrowserMob:


			net.lightbody.bmp
			browsermob-proxy
			2.0-beta-8
			test
			
				
					org.seleniumhq.selenium
					selenium-api
				
			
		

Java реализация BrowserMob представлена в виде набора классов, основной из которых net.lightbody.bmp.proxy.ProxyServer.
Пример запуска прокси-сервера с FirefoxDriver и сбора данных загрузки страницы:

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;

import org.junit.Test;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ProxyServerTest {

    @Test
    public void testMobProxyServer() throws Exception {
        // запуск прокси сервера
        ProxyServer server = new ProxyServer(4444);
        server.start();

        // получение Selenium proxy
        Proxy proxy = server.seleniumProxy();

        // конфигурация FirefoxDriver для использования прокси
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        WebDriver driver = new FirefoxDriver(capabilities);

        // создание HAR с меткой "yandex.ru"
        server.newHar("yandex.ru");

        // открытие страницы
        driver.get("http://yandex.ru");

        // получение данных HAR
        Har har = server.getHar();

        // здесь будет обработка полученных данных

        driver.quit();
        server.stop();
    }
}

Вывод в консоль свидетельствует об успешном запуске и остановке прокси-сервера на 4444 порту:

HttpSer~ - Version Jetty/5.1.x
Contain~ - Started HttpContext[/,/]
SocketL~ - Started SocketListener on 0.0.0.0:4444
Contain~ - Started net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6
Threade~ - Stopping Acceptor ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4444]
SocketL~ - Stopped SocketListener on 0.0.0.0:4444
Contain~ - Stopped HttpContext[/,/]
Contain~ - Stopped net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6

HAR

BrowserMob Proxy предоставляет полученную им информацию в HAR (HTTP Archive) формате. Этот формат используется инструментами мониторинга HTTP для выгрузки собранных данных. Фактически HAR формат представляет из себя JSON структуру данных в кодировке UTF-8, которую можно просматривать и анализировать использую различные HAR визуализаторы.

После того как в тесте мы получили данные HAR их можно сохранить физически в виде файла:

// получение данных HAR
        Har har = server.getHar();

        // обработка полученных данных
        try {
            File file = new File("results\\Test.har");
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
            try {
                har.writeTo(fos);
            }
            finally {
                fos.close();
            }
        }
        catch (IOException e) {
            // обработка ошибки
            e.printStackTrace();
        }
        finally {
            driver.quit();
            server.stop();
        }

Обновив проект Вы увидите сохраненный файл Test.har в папке results (папка была предварительно создана перед запуском).

Полученный HAR файл содержит JSON данные, которые можно использовать как текстовую информацию, либо просмотреть в удобном представлении, используя один из существующих онлайн инструментов, например, HTTP Archive Viewer 2.0.15:

Получить интересующую Вас информацию и поместить ее в собственный отчет можно и без сохранения HAR файла. Java класс net.lightbody.bmp.core.har.HarLog предоставляет набор методов для выборочного получения нужной информации:

Har har = server.getHar();

        // получить информацию о браузере
        System.out.println(har.getLog().getBrowser().getName());
        System.out.println(har.getLog().getBrowser().getVersion());

        // список всех обработанных запросов
        for (HarEntry entry : har.getLog().getEntries()) {

            System.out.println(entry.getRequest().getUrl());
            // время ожидания ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getWait());
            // время чтения ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getReceive());
        }

Помимо сбора информации net.lightbody.bmp.proxy.ProxyServer позволяет манипулировать запросами и полученными ответами с помощью добавления интерсепторов запросов и ответов соответственно:

public void addRequestInterceptor(RequestInterceptor interceptor)
public void addResponseInterceptor(ResponseInterceptor interceptor)

Пример интеграции BrowserMob с драйверами ChromeDriver и InternetExplorerDriver:

public class ProxyServerTest {

    private static ProxyServer server;
    private static Proxy proxy;

    @BeforeClass
    public static void setUpProxy() throws Exception {
        server = new ProxyServer(4444);
        server.start();
        proxy = server.seleniumProxy();
    }

    @Before
    public void createNewHar() {
        server.newHar("yandex.ru");
    }

    /**
     * ChromeDriver
     */
    @Test
    public void testChromeDriver() throws Exception {
        ChromeOptions option = new ChromeOptions();
        option.addArguments("--proxy-server=localhost:" 
                                                + server.getPort());
        WebDriver driver = new ChromeDriver(option);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    /**
     * InternetExplorerDriver
     */
    @Test
    public void testIEDriver() throws Exception {
        DesiredCapabilities capabilities = 
                                DesiredCapabilities.internetExplorer();
        capabilities.setCapability(CapabilityType.PROXY, proxy);
        capabilities.setCapability("ie.setProxyByServer", true);
        WebDriver driver = new InternetExplorerDriver(capabilities);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    @After
    public void saveHAR() throws Exception {
        Har har = server.getHar();
        File file = new File("results\\" 
                         + har.getLog().getBrowser().getName() + ".har");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(file);
        try {
            har.writeTo(fos);
        }
        finally {
            fos.close();
        }
    }

    @AfterClass
    public static void stopProxyServer() throws Exception {
        server.stop();
    }
}
Мар 192016
 

Selenium WebDriver: basic авторизация

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

На сегодняшний день количество сайтов использующих basic авторизацию не так уж и велико, чаще это веб-приложения, используемые для административных или корпоративных целей.
Основная проблема при тестировании таких приложений это нативные диалоговые окна, при появлении которых, также как и алертов, дальнейшее управление браузером с помощью Selenium становится просто невозможным.

Deprecated Одним из способов избежать появления диалогового окна может быть 
использование специального URL формата http://username:password@example.com/ 
для передачи учетных данных. Эта конструкция все еще поддерживается некоторыми 
браузерами, однако такое решение является официально устаревшим и иногда может 
отрицательно влиять на корректное выполнение дальнейших запросов на странице. 
Поэтому я настоятельно рекомендую не использовать такой подход для тестирования.

BrowserMob Proxy

При использовании basic аутентификации имя пользователя и пароль включаются в состав веб-запроса в стандартный HTTP заголовок «Authorization». Из этого можно заключить, что для успешного прохождения авторизации достаточно изменить HTTP заголовок перед отправкой на сервер. Сам Selenium не умеет манипулировать отправляемыми запросами, но для этих целей отлично подойдет прокси-сервер, в частности BrowserMob Proxy в силу простоты его подключения. Об интеграции и использовании BrowserMob с Selenium WebDriver можно почитать в предыдущей статье. В случае basic авторизации net.lightbody.bmp.proxy.ProxyServer предоставляет метод для ее автоматического выполнения:

server.autoBasicAuthorization("example.com", "username", "password"); 

Важно то, что первый аргумент autoBasicAuthorization это не URL, а именно доменное имя. Он не должен содержать http:// или других частей URL. Для того, чтобы использовать учетные данные для любого домена нужно оставить первый параметр пустым.

server.autoBasicAuthorization("", "username", "password"); 

Пример автоматической basic-аутентификации с BrowserMob Proxy:

import net.lightbody.bmp.proxy.ProxyServer;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ProxyServerBasicAutorizationTest {

    private ProxyServer server;
    private WebDriver driver;

    @Before
    public void startProxy() throws Exception {
        server = new ProxyServer(4444);
        server.start();
        server.autoBasicAuthorization("", "username", "password");
        Proxy proxy = server.seleniumProxy();

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        driver = new FirefoxDriver(capabilities);
    }

    @Test
    public void testAccessProtectedSite() throws Exception {
        driver.get("https://example.com");
        driver.findElement(By.className("sign-out"));
    }

    @After
    public void stopProxyServer() throws Exception {
        driver.quit();
        server.stop();
    }
}

И напоследок ложка дегтя, BrowserMob Proxy работает только с basic-аутентификацией и не предоставляет методов для работы с другими протоколами (Kerberos, NTLM и др.).

AutoIt

Для автоматизации прохождения basic-авторизации можно также использовать AutoIt: нужно перехватить диалоговое окно, ввести учетные данные и подтвердить ввод. Казалось бы ничего сложного, но каждый браузер для авторизации формирует окна разных классов: Firefox использует свои диалоговые окна, IE — класс диалоговых окон Windows, а Chrome и вовсе не создает отдельного окна для ввода. В этом можно убедиться используя утилиту AutoIt Window Info. В единичном случае, например, для Firefox скрипт AutoIt может выглядеть следующим образом:

Local $classForBasicAuthWindow = "[CLASS:MozillaDialogClass]";

;ожидание появления окна 10 секунд
WinWait($classForBasicAuthWindow, "", 10)

If WinExists($classForBasicAuthWindow) Then
	WinActivate($classForBasicAuthWindow)
 
	;имя пользователя
	Send($CmdLine[1] & "{TAB}"); 

	;пароль
	Send($CmdLine[2] & "{ENTER}"); 

EndIf

Файл .au3 необходимо переконвертировать в .exe для дальнейшего использования в ходе выполнения теста. Сделать это можно с помощью Aut2exe:

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

public class AutoItBasicAutorizationTest {

    private final String username = "username";
    private final String password = "password";

    @Test
    public void testBasicAuthenticationFirefox() throws Exception {
        WebDriver driver = new FirefoxDriver();
        File autoIt = new File("src/test/resources/auth.exe");

        // запуск exe с передачей учетных данных
        // в качестве параметра
        Process p = Runtime.getRuntime().exec(
                autoIt.getAbsolutePath() + " " 
                                  + username + " " + password);

        driver.get("https://example.com");
        driver.findElement(By.className("sign-out"));
        driver.quit();
    }
}

Если есть необходимость тестировать во всех браузерах используя один скрипт AutoIt, то его можно расширить требуемыми условиями:

$timeoutSec = 10;
$lookingSec = 0;
While $lookingSec < $timeoutSec
	;Firefox or InternetExplorer or Chrome
    If WinExists("[CLASS:MozillaDialogClass]") _
		Or WinExists("[TITLE:Windows Security; CLASS:#32770]") _
			Or WinExists("[CLASS:Chrome_WidgetWin_1]", _
									"Authentication Required") Then
				;вводим учетные данные
				;имя пользователя
				Send($CmdLine[1] & "{TAB}"); 
				;пароль
				Send($CmdLine[2] & "{ENTER}"); 
				Exit;
    EndIf
    sleep(1000)
	$lookingSec += 1;
WEnd

Приведенные выше заголовки и классы окон могут отличаться в зависимости от версий браузеров и их настроек, проверить и получить Ваши текущие данные можно используя AutoIt Window Info.