2012-04-13 11 views
1

Я никогда не делал много с AppleScript, но я пытаюсь автоматизировать этот процесс. У меня есть веб-сайт с кнопкой, которую нужно щелкнуть. Однако кнопка осуществляется с JavaScript/JQuery/AJAX выглядеть примерно так:Нажав на ссылку JavaScript/jQuery с Applescript

<div id="divIdOfButton" class="someClass"> 
    <div class="divClassOfButton someOtherClass"> 
     <img src="imgOfButton"> 
    <div> 

... 

<script type="text/javascript"> 

$(document).ready(function() { 
$('#divIdOfButton .divClassOfButton).click(function() { 
... 
}} 

Я пытался это без удачи

tell application "Safari" 
    activate 
    delay 1 
    set URL of first document to "http://example.com/" 
    do JavaScript "document.getElementById('divIdOfButton').getElementByClassName('divClassOfButton')[0].click()" in front document 
end tell 

Я сделал кучу поисков, но не смогли найти ничего. Было бы очень полезно помочь.

+0

Можете ли вы предоставить ссылку? – adayzdone

+0

К сожалению, это сайт, который требует членства. – user500119

+0

Будет ли он работать, если бы я скопировал весь $ (document.ready (.... в applescript и сказал «сделать Javascript» ... »в переднем документе? – user500119

ответ

5

Большинство браузеров игнорируют прямые вызовы обработчику событий click, it seems (по соображениям безопасности - не запускайте меня в модели безопасности JavaScript в браузерах), поэтому ваш вызов click() просто ничего не делает. Вы можете активировать событие click с помощью механизма диспетчеризации событий JavaScript (см. this question и answer of mine). Однако, если сайт вы предназначаться уже действительно включает JQuery, все, что вам нужно сделать, это:

tell application "Safari" 
    do JavaScript "$('#divIdOfButton .divClassOfButton').click();" in front document 
end tell 

Если есть несколько кнопок класса в вашем DIV, вам необходимо добавить выражение фильтра, т.е.

tell application "Safari" 
    do JavaScript "$('#divIdOfButton .divClassOfButton :equ(0)).click();" in front document 
end tell 

но вы потеряете преимущество производительности querySelectorAll мобилизуемых JQuery без этого (см jQuery API docs).

Протестировано путем выпадающего списка входящих сообщений на сайтах переполнения стека в Safari.

+0

Огромное вам спасибо. Это именно то, что я искал :) – user500119

+0

Утверждение 'Вы не можете вызвать событие click из обычного JavaScript' неверно (и противоречит вашей ссылке). Вы можете использовать * dispatchEvent * (совместимый с W3C) или * fireEvent * (совместимый с IE), или если браузер поддерживает HTML5, вызовите метод [click] (http://www.w3.org/TR/html5/editing .html # dom-click) (например, 'element.click()'). Поведение не является особенно последовательным (например, некоторые версии Firefox не будут следовать синтетическим щелчкам по ссылкам), но если OP беспокоится только о конкретном браузере, это может быть хорошо. – RobG

+0

@RobG true, предложение недостаточно точное - «вы не можете вызвать обработчик кликов непосредственно в обычном JavaScript в большинстве браузеров» будет ближе к знаку (отредактирован как таковой). Тем не менее, в отношении поддержки HTML5 (повторного), устанавливающего эту способность, это, по-видимому, не соответствует, по крайней мере, текущей версии Safari в OS X, которая в моих экспериментах игнорировала прямые вызовы обработчику кликов. – kopischke

-1

Я не пользователь Applescript, но могу сразу сказать, что getElementByClassName должен быть getElementsByClassName - «элементы» во множественном числе.

+0

Спасибо Kolink, попробовал изменить это, но он не сделал, t work .. – user500119

+0

В любом случае, в разумно текущем браузере вам будет намного лучше использовать ['querySelectorAll'] (http://www.w3.org/TR/selectors-api/), который быстро и быстро использует CSS-селекторные строки * à la * jQuery. Но это не проблема - см. [мой ответ] (http://stackoverflow.com/a/10143157/990363) для получения дополнительной информации. – kopischke

+0

Согласитесь с копишке там - тем более, что 'querySelector [Все] 'поддерживается в mor e браузеров, чем 'getElementsByClassName'. –

1

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

Смежные вопросы