2013-09-04 3 views
0

Многие из них предположили, что я просто использую .onload и запускаю обратный вызов после того, как скрипт готов. Это не работает для меня. Я пишу функцию, и он ожидает элемент сразу, а не позже. Вот что я получил:Как синхронно вводить скрипт?

webdriver.By.sizzle = function(selector) { 
    driver.executeScript("if(typeof Sizzle==='undefined'){var s=document.createElement('script');s.type='text/javascript';s.src='https://raw.github.com/jquery/sizzle/master/src/sizzle.js';document.head.appendChild(s);}"); 
    return new webdriver.By.js("return Sizzle('"+selector.replace(/"/g,'\\"')+"')[0]"); 
}; 

Я хочу, чтобы придать Sizzle (если он еще не включен), а затем возвращают HtmlElement. Он может занят - подождите, если нужно, но он должен вернуть HtmlElement.

Все answers here в основном просто сказал «не делай этого», но я не могу думать о другом.

Это селектор для веб-драйвера селена для JavaScript.


driver.executeScript будет принимать аргументы. Интересно, могу ли я передать webdriver.promise и вызвать его при загрузке скрипта ...? Я не знаю, как «наполнить» обещание.

+0

Провести обратный вызов/вернуть обещание. –

+1

Простой [поиск Google] (https://www.google.com/search?q=load+script+dynamically+javascript&rlz=1C1CHFX_enUS515US515&oq=load+script+dynamical&aqs=chrome.1.69i57j0l3.4831j0&sourceid=chrome&ie=UTF-8) показывает, как загрузить сценарий динамически: http://unixpapa.com/js/dyna.html.Неясно, что вы подразумеваете под «возвратом HTML-элемента». – jfriend00

+2

@ jfriend00 динамически сгенерированные скрипты загружаются асинхронно, OP хочет сделать это синхронно, чтобы он мог вернуться из функции после вставки скрипта. –

ответ

0

Это немного медленно, но я думаю, что я нашел решение:

webdriver.By.sizzle = function(selector) { 
    driver.executeScript("return typeof Sizzle==='undefined'").then(function(noSizzle) { 
     if(noSizzle) driver.executeScript(fs.readFileSync('sizzle.min.js', {encoding: 'utf8'})); 
    }); 
    return new webdriver.By.js("return Sizzle('"+selector.replace(/"/g,'\\"')+"')[0]"); 
}; 

Я просто скачал сценарий и я инъекционный все вещь инлайн. Таким образом, мне не нужно ничего ждать.

0

Почему бы вам не включить шипение в качестве требования к скрипту на странице. Просто вставьте

<script src="sizzle.js"></script> 

0 0 Чтобы сделать это динамически, просто добавьте скрипт в голову. http://jsfiddle.net/nQePg имеет демонстратор, который показывает, что выполнение сценария останавливается во время анализа и оценки впрыска.

+0

У меня нет доступа, потому что я загружаю веб-страницу через Selenium, а затем вводя собственный код. – mpen

+0

вправо, поэтому вводите в голову. –

+0

Прочтите код, который я разместил ... Я. Не помогает. После этого он не готов. – mpen

2

Лучшим выбором здесь будет редизайн/реструктуризация вашего кода для обработки асинхронной загрузки Sizzle и возврата результата с помощью функции обратного вызова. Вот как проектируется javascript. У него нет «хорошего» способа загрузки удаленных ресурсов синхронно.

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

Причина, по которой это плохо, заключается в том, что блокирующий вызов ajax блокирует браузер в течение неопределенного промежутка времени при загрузке удаленного ресурса. Этот тип дизайна плохо для пользователя.


Единственный выбор, который я могу думать о том, чтобы убедиться, что во время загрузки страницы, что все необходимые ресурсы уже определены так, что они уже предварительно загружены, когда ваш сценарий затем требует от них. Загрузка удаленного ресурса по требованию вызывает проблему async.

+0

«Причина, по которой это плохо, заключается в том, что блокирующий вызов ajax блокирует браузер в течение неопределенного промежутка времени, пока загружается удаленный ресурс. Этот тип дизайна плохо для пользователя». - Нет пользователя. Это автоматический тест. Он может ждать столько, сколько нужно. Невозможно заранее указать ресурсы; Я ввожу это в страницу, которую загружаю селеном. – mpen

+0

@Mark, тогда вы можете заблокировать браузер с помощью синхронного ajax. Я дал вам путь к преследованию. Вот аналогичный вопрос/ответ: http://stackoverflow.com/questions/2879509/dynamically-loading-javascript-synchronously – jfriend00