Как выполнить базовую аутентификацию с помощью Selenium Webdriver и PhantomJS?

У меня проблемы с аутентификацией при использовании Selenium Server 2.33.0, привязки Selenium Webdriver JS 2.34.0 (пакет npm "selenium-webdriver") и PhantomJS 1.9.1 на Mac 10.6.8. Я также пробовал другие привязки JS «webdriverjs» и «wd» с аналогичными результатами, поэтому я не думаю, что это проблема с этой привязкой.

Я настраиваю Webdriver, используя это:

return new Webdriver.Builder().
    usingServer('http://localhost:4444/wd/hub').
    withCapabilities({
        "browserName": "phantomjs",
        "phantomjs.page.settings.userName":user,
        "phantomjs.page.settings.password":password
    }).build();

Затем я вижу в журнале Selenium Server этот вывод:

PhantomJS is launching GhostDriver...
[INFO  - 2013-08-13T21:52:40.240Z] GhostDriver - Main - running on port 28904
[INFO  - 2013-08-13T21:52:40.394Z] Session [acd0ad70-0462-11e3-95df-4b230b17334d] - CONSTRUCTOR - Desired Capabilities:{"phantomjs.page.settings.password":"xxx","browserName":"phantomjs","phantomjs.page.settings.userName":"xxx"}
[INFO  - 2013-08-13T21:52:40.394Z] Session [acd0ad70-0462-11e3-95df-4b230b17334d] - CONSTRUCTOR - Negotiated Capabilities: {"browserName":"phantomjs","version":"1.9.1","driverName":"ghostdriver","driverVersion":"1.0.3","platform":"mac-10.6 (Snow Leopard)-32bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"},"phantomjs.page.settings.password":"xxx","phantomjs.page.settings.userName":"xxx"}

Я вижу, что согласованные возможности содержат пользователя и пароль, которые я указал. Но аутентификация завершается ошибкой, когда я пытаюсь открыть страницу на веб-сайте, использующем базовую аутентификацию http:

14:43:25.504 INFO - Executing: [find element: By.id: auth-username-field-inputEl] at URL: /session/04627dc2-a16c-42b3-b3dc-48e502f7cfec/element)
14:43:29.410 WARN - Exception thrown org.openqa.selenium.NoSuchElementException: Error Message => 'Unable to find element with id 'auth-username-field-inputEl''

Если я запускаю свой скрипт на локальном веб-сайте, на котором нет аутентификации, он работает нормально. Если я просматриваю удаленный веб-сайт с помощью Firefox (не через Selenium), я могу пройти аутентификацию и увидеть домашнюю страницу.

Я также пытался запустить PhantomJS в режиме Webdriver, используя «-w», и получаю аналогичный результат.

Это работает, если я запускаю этот скрипт с phantomjs:

var page=require('webpage').create();
//page.customHeaders={'Authorization': 'Basic '+btoa('xxx:xxx')};
page.settings.userName="xxx";
page.settings.password="xxx";
var callback=function(status){
    if(timer)window.clearTimeout(timer);
    if (status=='success' || status=='timedout') {
        console.log(status);
        console.log(page.plainText);
    }else{
        console.log('Failed to load.');
    }
    phantom.exit();
    };
var timer=window.setTimeout(callback,60000,'timedout');
var url="http://xxx.com";
page.open(url,callback);

Я скопировал этот скрипт из этой публикации. Я обнаружил, что с 1.9.1 имя пользователя и пароль работают нормально, мне не нужно было устанавливать customHeader. Я попробовал customHeader в своем скрипте Selenium, но это не имело значения. Это может быть проблема с GhostDriver.

Кто-нибудь смог заставить это работать?


person ybendana    schedule 14.08.2013    source источник
comment
Похоже, страница загружается неправильно. Вы пытались сделать снимок экрана/получить исходный код html, чтобы увидеть, как выглядит страница, на которой вы пытаетесь запустить?   -  person Nathan Merrill    schedule 14.08.2013
comment
Да, скриншот пустой, а исходник — пустая html-страница.   -  person ybendana    schedule 15.08.2013


Ответы (1)


Я точно в такой же ситуации.

Моя теория заключается в том, что мы делаем запрос с использованием NTLM (проверка подлинности Windows), который запросит 401 (неавторизованный) и потребует повторной отправки запроса с комбинацией имени пользователя и пароля. GhostDriver совершенно ясно указывает, что настройки применяются только во время первоначального вызова, что, скорее всего, устранит учетные данные переданы.

Довольно неприятно, что версия JavaScript работает так хорошо, а версия C# так эффектно терпит неудачу.

Если есть предложения, буду рад их услышать.

person R. Michael Rogers    schedule 02.02.2014