解释"寻找行动"在Safari上的结果

时间:2018-03-26 02:45:22

标签: macos applescript

我正在尝试创建一个AppleScript,可以在网页上找到文本并告诉我收到的匹配数量(Command + F)。

我已经知道如何做"查找"部分:

  tell application "System Events"
    delay 0.5
    keystroke "f" using {command down}
  end tell

但是,我不知道如何解释这些结果,例如告诉我是否匹配,或者我有多少匹配。

有没有办法做到这一点?(如果看起来有点模糊,我可以更具体一点)

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,我必须说 UI脚本可能会变得混乱和不可靠。我建议你找到一种不同的方式来实现真正的目标。

也就是说,使用 macOS High Sierra 10.13.3 中的 Safari 设置到此网页,以下示例 AppleScript < / strong> 代码会将变量 theSearchResult设置为搜索单词“vague”的结果:

tell application "Safari" to activate
delay 0.5
tell application "System Events"
    keystroke "f" using command down
    delay 0.2
    keystroke "vague"
    delay 0.2
    set theSearchResult to (value of static text 1 of group 2 of tab group 1 of splitter group 1 of window 1 of application process "Safari")
    delay 0.2
    key code 53 -- # Esc
end tell
return theSearchResult

Result:
"1 match"
  • 请注意,可能需要针对您的系统和/或其他delay 命令调整delay 命令 可能需要也可能不需要。根据需要调整和/或添加/删除delay 命令

搜索结果可以是以下之一,Not found或整数后跟单词match,例如1 match,可能还有别的,不确定,因为我没有做过大量的测试。

您希望如何解释结果取决于您。您可以在if上使用theSearchResult 语句,例如:

if theSearchResult contains "Not found" then
    -- # Do something.
    -- # Your code goes here.

else
    -- # Do something else.
    -- # Your code goes here

end if

要考虑的另一个因素是如何搜索,即Starts WithContains。我相信 macOS High Sierra 10.13.3 Safari 默认Starts With

注意: 示例 AppleScript 代码就是这样,并且不使用任何错误处理并且仅用于显示完成任务的多种方法之一。用户有责任根据需要添加/使用适当的错误处理

答案 1 :(得分:0)

我同意@user3439894以及他对使用 UI脚本的看法(在这种情况下 - 获取系统事件来发布鼠标点击和按键)代表你)。虽然它在其他领域有其用途,但它远远不是我个人最不喜欢的方法来实现目标,而且是最后的手段之一。

为什么它可能是一个脆弱的实现的两个非常快速的原因是: 1)用于启动{{1的 Cmd F 快捷方式菜单命令可以通过您自己的操作进行更改,或者是否被系统范围的快捷方式覆盖,该快捷方式取代了 Safari 对它的声明(事实上,由于这个原因,我将通过Find...亲自触发Find...命令,系统事件可以代表您menu bar。菜单项不会像快捷方式那样改变,除非区域语言设置));和 2)如果 Safari 在发出按键并启动搜索时失去焦点,它会扰乱脚本中的整个命令流,并且最多会给出你没有结果,但更可能的是,在脚本的后续部分抛出错误。

我将演示两种替代方法,用于搜索 Safari 网页中的一段文字,并获取整个文档中匹配的次数。

1。 Safari &#39; click AppleScript命令

大多数现代网络浏览器都能够在其标签中运行JavaScript代码, Safari 也可以。 AppleScript可以控制这个非常有用的功能,只要您通过进入 Safari Develop 菜单并勾选允许来自Apple Events的JavaScript来授予它权限允许远程自动化(后者已经开启,我猜)。还有另一个名为允许来自智能搜索字段的JavaScript 的菜单项 - 我会建议您保留此项,否则可能会让顽皮的网站向您的计算机发出命令并导致恶作剧。< / p>

do JavaScript

要解决此问题: use A : application "Safari" set D to the front document of A set s to "AppleScript" -- the search string try set n to (do JavaScript ¬ "document" & ¬ ".body" & ¬ ".innerText" & ¬ ".match(/" & s & "/ig)" & ¬ ".length;" in D) as integer -- the number of matches on error set n to 0 end try 是您在搜索框中输入的搜索字符串。它被送入JavaScript命令,该命令具有以下组件:

  • s :对 Safari 网页文档的引用;
  • document :文档的正文,而不是标题或页脚。它是用户在他们面前看到的主要网页;
  • body :文档正文中包含的文字,没有任何HTML格式,但保留了空格;
  • innerText JavaScript中的方法或函数,其中搜索字符串match()用于在s内执行搜索并返回列出所有的数组比赛;
  • innerText length返回的数组的属性,用于报告包含的元素数量,这相当于搜索期间找到的匹配数。 / LI>

它是一个命令,在一行中完整写入,看起来像这样(使用搜索字符串match()):

"AppleScript"

它返回一个数字,该数字存储在变量 document.body.innerText.match(/AppleScript/ig).length; 中,并且就是它。

这是我最喜欢的方法,我会选择自己使用,因为它不太可能会破坏,而且它很好而且快速。

我应该指出n实际使用Regular Expression进行搜索和匹配。我现在不会进入它们,但这意味着如果使用任何特殊字符,搜索字符串match()将需要小心:

s

您需要注意的是,如果您的搜索字符串使用任何这些字符,则应在其前面加上双反斜杠 \ [ ] { } ^ $ . | ? * + ( ) 。因此,例如,如果我想搜索\\(使用"matches I received(Command + F)"()),那么我会将变量+声明为:

s

2。 Chop&amp;测量

如果您不希望在浏览器中启用远程JavaScript ,或者仅仅想要一些简单易懂的内容,那么此方法非常有用下次。

使用AppleScript&#39; set s to "matches I received\\(Command \\+ F\\)" 进行简单的文本操作,并进行一些计算:

text item delimiters

Safari 有一个名为 use A : application "Safari" set D to the front document of A set s to "AppleScript" -- the search string set T to text of D -- the webpage text content set l to {initialValue:length of T, finalValue:missing value} set the text item delimiters to s set T to text items of T set the text item delimiters to "" set T to T as text set l's finalValue to length of T set |l| to (l's initialValue) - (l's finalValue) set n to |l| / (length of s) 的有用的AppleScript属性,它指的是指定的textdocument的文本内容(它还有另一个属性叫做tab包含sourcedocument的HTML源代码。

以下是细分:

  • Safari tab属性(网页的文字内容)的值存储在变量text;
  • 读取并存储T的{​​{1}}。这相当于整个网页上的字符数;
  • length设置为搜索字符串T,(需要担心特殊字符,因此请勿插入不必要的反斜杠这个)。 text item delimiterss基本上擦除所有text item delimiters s;
  • 然后再次读取T的T。如果lengths中找到任何匹配项,则表示T字符的T将减少;
  • 它会减少发生的每次匹配length 中的字符数。因此,将方程式稍微调整一下,匹配数s等于n length的变化除以T length }。

还有其他方法可以使用AppleScript,JavaScript,bash等搜索网页,但我认为这两个方法是如何使用非常不同的方法实现相同目标的合理示例。我将它们称为示例,因为您可能需要对脚本进行小的调整以满足您自己的需要,例如在第一个示例中在必要时插入反斜杠,或者在第二个示例中考虑如何处理这种情况如果将s设置为空字符串s(它会抛出错误,但这很容易管理)。

他们同时返回""的{​​{1}}值,即real。在第二个例子中很容易理解为什么,但我认为它只是第一个例子中JavaScript和AppleScript之间的类型转换(我不知道)。因此,纯粹为了整洁,我会像第一个那样将返回的值强制转换为整数,因此它会显示n而不是11.0

11

但你不必这样做。