2012-04-13 12 views
1

Ich habe noch nie viel mit AppleScript getan, aber ich versuche diesen Prozess zu automatisieren. Ich habe eine Website mit einem Button, der angeklickt werden muss. Allerdings ist die Schaltfläche mit JavaScript/jQuery/AJAX implementiert ist wie folgt:Klicken Sie auf JavaScript/jQuery Link mit 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() { 
... 
}} 

habe ich versucht, dies ohne Erfolg

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 

ich ein paar Such tat, konnte aber nichts finden. Würde mich über Hilfe freuen.

+0

Können Sie einen Link angeben? – adayzdone

+0

Leider ist es eine Website, die eine Mitgliedschaft erfordert. – user500119

+0

Würde es funktionieren, wenn ich das ganze $ (document.ready (.... in applescript und sagte "do javascript" ... "im vorderen Dokument? – user500119

Antwort

5

werden Die meisten Browser direkte Aufrufe an den Click-Ereignishandler ignorieren, it seems (offenbar aus Sicherheitsgründen - nicht mich auf dem JavaScript-Sicherheitsmodell in Browsern zu beginnen), so dass Ihr click() Anruf einfach gar nichts tut. Sie können das Click-Ereignis über den Event-Dispatching-Mechanismus von JavaScript auslösen (siehe this question und answer of mine). Wenn jedoch die Website, die Sie bereits Ziel ist jQuery enthält alles, was Sie tun müssen, ist:

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

Wenn es mehr Tasten der Klasse in Ihrem DIV sind, müssen Sie einen Filterausdruck hinzufügen, dh

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

aber Sie werden den Leistungsvorteil von querySelectorAll gehebelt von jQuery, ohne dass dies (siehe jQuery API docs) verlieren.

Getestet durch Auslösen des Dropdown-Posteingangs auf Stack-Überlauf-Sites in Safari.

+0

Vielen Dank. Genau das habe ich gesucht :) – user500119

+0

Die Aussage 'Sie können das Klickereignis nicht aus reinem JavaScript auslösen 'ist inkorrekt (und wird durch Ihren Link widerlegt). Sie können entweder * dispatchEvent * (W3C-kompatibel) oder * fireEvent * (IE-kompatibel) verwenden. Wenn der Browser HTML5 unterstützt, rufen Sie die [click-Methode] (http://www.w3.org/TR/html5/editing) auf .html # dom-click) (zB 'element.click()'). Das Verhalten ist nicht besonders konsistent (z. B. werden einige Versionen von Firefox synthetischen Klicks auf Links nicht folgen), aber wenn das OP nur über einen bestimmten Browser besorgt ist, kann es in Ordnung sein. – RobG

+0

@RobG True, der Satz ist nicht genau genug - "Sie können den Click-Handler nicht direkt in plain JavaScript in den meisten Browsern aufrufen" wäre näher an der Marke (als solche bearbeitet). In Bezug auf die HTML5-Unterstützung, die diese Fähigkeit wieder herstellt, scheint dies jedoch zumindest bei den aktuellen Versionen von Safari unter OS X, die bei meinen Experimenten direkte Aufrufe an den Click-Handler ignorierten, nicht richtig zu sein. – kopischke

-1

Ich bin kein Applescript-Benutzer, aber ich kann Ihnen sofort sagen, getElementByClassName sollte getElementsByClassName sein - "Elemente" im Plural.

+0

Vielen Dank Kolink, versucht, dies zu ändern, aber es didn ' t Arbeit .. – user500119

+0

Jedenfalls, auf einem einigermaßen aktuellen Browser, wäre es viel besser mit [querySelectorAll'] (http://www.w3.org/TR/selectors-api/), die blitzschnell und ist verwendet CSS-Selektorketten * à la * jQuery, aber das ist nicht das Problem - siehe [meine Antwort] (http://stackoverflow.com/a/10143157/990363) für Details – kopischke

+0

stimme mit kopischke da - vor allem seit 'querySelector [All] 'wird in mor unterstützt E Browser als 'getElementsByClassName'. –

1

Ich würde auschecken UI Browser es ist toll für diese Art von Dingen, ich benutze es die ganze Zeit.

Verwandte Themen