2015-01-10 3 views
5

У меня очень простой скрипт selenium-webdriver. Я хотел бы сделать HTTP-аутентификацию с помощью webdriver.Webdriver - диалог проверки подлинности HTTP

Сценарий:

WebDriver driver = new FirefoxDriver(); 
driver.get("http://www.httpwatch.com/httpgallery/authentication/"); 
driver.findElement(By.id("displayImage")).click(); 
Thread.sleep(2000); 
driver.switchTo().alert().sendKeys("httpwatch"); 

Выпуск:

driver.switchTo().alert().sendKeys("httpwatch"); 

бросает

org.openqa.selenium.NoAlertPresentException: Нет предупреждения не присутствует

Вопрос:

  • Подходит ли Webdriver только предупреждение в качестве оповещения?
  • Какие варианты автоматизировать это без использования AutoIt ИЛИ HTTP: // имя пользователя: пароль @somesite

EDIT

оповещения имеет ниже метод и не кажется, что было реализовано.

driver.switchTo().alert().authenticateUsing(new UsernameAndPassword("username","password")) 

ответ

5

Проблема заключается в том, что это не Javascript всплывающее, следовательно, вы не можете управлять им с помощью селена alert().

Если оба AutoIt и подающие учетные данные в URL (самый простой вариант - просто откройте the url и нажмите кнопку «Показать изображение») не являются для вас варианты, другой подход может быть использование AutoAuth firefox addon автоматически отправлять ранее сохраненные учетные данные:

AutoAuth автоматически отправляет диалоговые окна проверки подлинности HTTP, когда вы выбрали , чтобы браузер сохранял ваши данные для входа. (Если у вас есть , то уже сказал браузеру, что ваше имя пользователя и пароль, и вы сказали ему запомнить это имя пользователя и пароль, почему бы не просто ли он автоматически отправлять его, а не спрашивать вас каждый раз?)

После ответа предложил в HTTP Basic Auth via URL in Firefox does not work? теме:

  • Установите AutoAuth Firefox плагин;
  • Посетите сайт, на котором требуется аутентификация.Введите свое имя пользователя и пароль и не забудьте сохранить учетные данные;
  • Сохраните файл установки AutoAuth на вашем жестком диске: на странице плагина щелкните правой кнопкой мыши «Добавить в Firefox» и «Сохранить ссылку как»;
  • Instantiate Firefox WebDriver следующим образом:
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default"); 
File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi"); 
firefoxProfile.addExtension(pluginAutoAuth); 
driver = new FirefoxDriver(firefoxProfile); 

Кроме того, по аналогии с опцией AutoIt - вы можете использовать sikuli распознавания экрана и инструмент автоматизации для передачи учетных данных во всплывающем окне.


Смотри также другие идеи и варианты:

+0

Благодаря alecxe, фрагмент кода, упомянутый выше работает для меня хорошо. –

+0

Вышеприведенный код предназначен для FF. Как я могу сделать то же самое с помощью Chrome и IE? –

+0

@RiponAlWasim пожалуйста, подумайте о создании отдельного вопроса об этом. Благодарю. – alecxe

3

Базовая аутентификация/NTLM всплывающее диалоговое окно браузера. WebDriver (Selenium 2.0) не может взаимодействовать с такими диалоговыми окнами. Причина этого заключается в том, что WebDriver преследует цель только имитировать взаимодействие пользователей с веб-сайтами, а окна браузера в настоящее время не входят в эту область. Диалоговые окна JavaScript, являются частью веб-сайта, поэтому WebDriver может их обрабатывать. В Selenium 1.0 можно выполнить базовую аутентификацию.

Как решить эту проблему? 1) Аутентификация по URL-адресу http://username:[email protected] 2) Используйте плагин для браузера, который будет обрабатывать аутентификацию Basic/NTLM. 3) Используйте локальный прокси-сервер, который изменит заголовок запроса и передаст имя пользователя/пароль. 4) Используйте робота, такого как AutoIt , или некоторая библиотека Java.

Вариант 1: самый простой и имеет наименьшее влияние на систему/испытание. Вариант 2: имеет высокий эффект браузера в качестве плагинов загрузки. Также каждый браузер использует свой собственный плагин, и возможно, что необходимый плагин для определенного браузера недоступен. Вариант 3: хорошо работает с HTTP, но HTTPS требует специальных сертификатов, поэтому не всегда вариант. Не так сильно влияет как на систему, так и на тест. Вариант 4: Мимика клавишных клавиш, это решение, но склонное к ошибкам. Работает только тогда, когда диалоговое окно имеет фокус, и возможно, что это не всегда так.

0

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

public class DialogWindow implements Runnable { 

@Override 
public void run() { 
    try { 
     entercredentials(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void entercredentials() InterruptedException { 
    Thread.sleep(5000); 
    try { 
     enterText("username"); 
     enterSpecialChar(KeyEvent.VK_TAB); 
     enterText("password"); 
     enterSpecialChar(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 

    } 
} 

private void enterText(String text) throws AWTException { 
    Robot robot = new Robot(); 
    byte[] bytes = text.getBytes(); 

    for (byte b : bytes) { 
     int bytecode = b; 
     // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
     if (bytecode> 96 && bytecode< 123) 
      bytecode = bytecode - 32; 
     robot.delay(40); 
     robot.keyPress(bytecode); 
     robot.keyRelease(bytecode); 
    } 
} 

private void enterSpecialChar(int s) throws AWTException { 
    Robot robot = new Robot(); 
    robot.delay(40); 
    robot.keyPress(s); 
    robot.keyRelease(s); 
} 

} 

Как назвать

WebDriver driver= new FirefoxDriver()// or any other driver with capabilities and other required stuff 

(new Thread(new DialogWindow())).start(); 

driver.get(url);