Как динамически загрузить встроенный JavaScript из WebDriver - PullRequest
0 голосов
/ 27 января 2012

Я реализую некоторые тесты AXAJ, которые я кодирую с помощью API WebDriver.Помимо этого, я мог выполнить произвольный код JavaScript, но мне нужно сделать некоторые пользовательские служебные функции доступными для любых дальнейших ссылок в моих тестах.Проблема в том, что мне нужно динамически загружать свой «встроенный» пользовательский javascript, который находится в файле на моем клиентском пути к классам.Поэтому я не мог использовать обычный подход, который зависит от манипулирования script.src.Я пытался манипулировать script.text, но безуспешно, я получаю ошибку javascript, например: «пропущен; до утверждения».Вы видите что-то не так с моим подходом?Любые другие идеи, как это сделать?

private static final String LOAD_DYNAMIC_JS = 
"(function(){" + 
"var em = document.createElement('script'); em.type = 'text/javascript';" +
"em.text=\"<![CDATA[" +
"function testalert(){" +
"alert(\"test\");" +
//"}" +
"]]>\";" +
"var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(em, s);"+
"})();"; 
((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS);

РЕДАКТИРОВАТЬ На самом деле мой пример был неверным.Потому что на практике я загружаю внедренный скрипт из файла, находящегося в пути к классам.И скрипт там отформатирован с переводом строки.Таким образом, проблема была именно в том, что сообщение об ошибке говорит: «... отсутствует;».Это потому, что скрипт, который я пытаюсь присвоить script.text, на самом деле является строковым литералом для включающей функции ().И строковые литералы в javascript не могут растягиваться на несколько строк, если они не заканчиваются символом «\».Кроме того, во время отладки я понял, что функция включения () не нужна, так как веб-драйвер уже делает это для вставки JavaScript в браузер.Раздел CDATA тоже не нужен.Итак, мой встроенный скрипт для инъекций, который наконец-то сработал:

private static final String LOAD_DYNAMIC_JS = 
"var em = document.createElement('script'); em.type = 'text/javascript';" +
"em.text= 'function testalert(){alert('test');};'"+
"var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(em, s);";
((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS);

1 Ответ

1 голос
/ 27 января 2012

Если вы измените это:

((JavascriptExecutor)driver).executeScript(LOAD_DYNAMIC_JS);

На это:

((JavascriptExecutor)driver).executeScript("{" + LOAD_DYNAMIC_JS + "}");

Это должно работать идеально ...

Если вы не выполняете ни одногооператора WebDriver необходимо, чтобы скрипт был заключен в фигурные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...