Как запустить скрипт Google Apps из HtmlUnit?

У меня есть ссылка на странице Сайтов Google, которая запускает скрипт Google Apps. Он отлично работает, когда я вручную нажимаю ссылку в Firefox.

Кажется, все работает нормально, когда я делаю то же самое с помощью HtmlUnit. С помощью HtmlUnit я могу войти в систему (необходимо войти в систему при запуске сценариев Google Apps), перейти на веб-страницу, определить ссылку и щелкнуть ее, но сценарий не запускается.

Суть кода проста:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX
<a href="#" name="MyAnchor" class="apps-script-run-link" id="ACiQKe2HyNeo..etc...01120b3d65#MyFunctionName">Click here to run function</a>
6); HtmlPage page = webClient.getPage("https://sites.google.com/site/mywebpage"); HtmlAnchor anchor = page.getAnchorByName("MyAnchor"); anchor.click();

Так чего не хватает или что я делаю не так?

Я создал исходную ссылку на веб-странице с помощью:

<a href="/macros/sites?action=run&lib=094bahv51120b3d65&funcName=MyFunctionName" name="MyAnchor">Click here to run function</a>

При сохранении редактирования веб-страницы Сайты Google автоматически изменили это на:

<a href="#" name="MyAnchor" class="apps-script-run-link" id="ACiQKe2HyNeo..etc...01120b3d65#MyFunctionName">Click here to run function</a>

click() не работает, потому что он действует на атрибут href, который теперь просто "#" вместо определения ссылки? Или поддержка языка HtmlUnit для JavaScript (Mozilla Rhino) не выполняет Javascript правильно для обработки нажатой ссылки (это означает, что мне нужно заменить Rhino чем-то, что распознает Javascript на веб-странице Сайтов Google)? Или какая-то другая основная ошибка, которую я сделал?

Я потерялся, поэтому любая помощь очень ценится !!

ОБНОВЛЕНИЕ

Я последовал твоему предложению, Родни, и обнаружил, что проблема заключалась не в выходе из сайтов Google. Использование HtmlUnit для щелчка по ссылке «Выйти» после щелчка по ссылке для выполнения сценария приводит к тому, что сценарий запускается нормально. Единственная проблема - это вызывает следующую ошибку (которая не останавливает выполнение скрипта):

СЕРЬЕЗНО: выполнение задания завершилось неудачно из-за непредвиденного исключения RuntimeException:
TypeError: невозможно установить для свойства "innerHTML" значение null значение "Завершенный сценарий: завершенный сценарий MyFunctionName"

ОБНОВЛЕНИЕ 2

Решили и эту проблему. Не хватило времени для завершения сценария перед выходом из системы. Добавление этого исправило это:

webClient.waitForBackgroundJavaScriptStartingBefore(5000);

Большое спасибо за вашу помощь, Родни - и Нэвин за хороший монтаж!


person Marty    schedule 06.06.2011    source источник


Ответы (1)


HtmlUnit имеет неплохую поддержку Javascript, поэтому я сомневаюсь, что проблема в этом.

Как узнать, что скрипт не запустился? Или, лучше, как узнать с точки зрения HtmlUnit, успешно ли выполнен скрипт? Когда вы нажимаете ссылку в FF, вы, вероятно, видите, что что-то происходит. Вы полагаетесь на человеческое зрение и браузер, предназначенный для использования людьми. Используя HtmlUnit, вам нужно указать своему коду «видеть» тот же результат, будь то изучение последующего дерева DOM, обработка всплывающего окна или что-то еще. Это немного сдвиг в мышлении.

Что делает ваш сценарий? Манипулировать содержанием страницы? Открыть диалог? Перенаправить на другую страницу? Некоторые вещи HtmlUnit обрабатываются автоматически, а некоторые (например, открытие диалоговых окон) требуют определения обработчиков.

person Rodney Gitzel    schedule 07.06.2011
comment
Да, сценарий изменяет содержимое другой веб-страницы. Легко проверить, запущен ли сценарий из HtmlUnit, просмотрев страницу в Firefox после события. Есть ли способ узнать, что сделал click () в HtmlUnit, кроме проверки возврата от функции click (), которая является страницей, на которую перешли по ссылке? Поскольку click () запускает только функцию сценария, возвращенная веб-страница такая же, как и текущая, поэтому это мало что говорит мне о том, что произошло. Как вы думаете, мне нужны дополнительные обработчики, чтобы делать то, что я пытаюсь сделать? - person Marty; 09.06.2011
comment
Ах ... возвращенная веб-страница такая же, как и текущая, не совсем правильная. Это тот же экземпляр HtmlPage, но его содержимое будет обновлено любым Javascript на странице, если ваш JS-код click () действительно изменяет DOM страницы. В худшем случае вызовите asXml () для объекта страницы до и после вызова click (); в идеале вы просматриваете DOM в поисках конкретных изменений. - person Rodney Gitzel; 09.06.2011
comment
Сценарий изменяет содержимое на другой странице, а не на странице, на которой находится ссылка, запускающая сценарий (может ли это быть важно?). Это не помешало бы мне в HtmlUnit перейти на эту страницу и проверить содержимое, как вы предлагаете, но как это могло что-то изменить, поскольку не является доказательством того, что я вручную просматриваю в Firefox позже и ничего не обнаружил? Или здесь происходит что-то более сложное, когда HtmlUnit фактически вносит изменения, но почему-то не записывается правильно на стороне сервера? Как вы думаете, стоит ли делать ваш тест asXml () в любом случае? - person Marty; 09.06.2011
comment
Это что-то меняет на другой странице? Извините, пропустил. Просто просмотрите эту страницу с помощью HtmlUnit и найдите изменения. Точно такой же процесс, как и вручную, вы просто делаете это в коде. - person Rodney Gitzel; 09.06.2011