【问题标题】:applescript getInputByClass2 with Safari 10.1applescript getInputByClass2 与 Safari 10.1
【发布时间】:2017-06-29 14:52:07
【问题描述】:

自从我上次系统更新后,我每天运行以从 Safari 获取文本的 Applescripts 无法正常工作

以前只能在 Safari 中工作,不能在 Safari Preview 中使用,我猜现在 Safari Preview 的系统已经被带到了 safari/

tell application "Safari"

    set DinfoGrab to do JavaScript "
document.getElementsByClassName(' field type-string field-Dinfo ')[0].innerHTML;" in tab 3 of window 1
end tell

出现此错误:

Safari 出现错误:无法制作“document.getElementsByClassName(' field type-string field-Dinfo ')[0].innerHTML;" 转换成文本类型。

我该如何解决这个问题?谢谢。

更新:

这里有一些与 Chrome 完美配合的东西:

tell application "Google Chrome"
        tell tab 3 of window 1 to set r to execute javascript "document.getElementsByClassName('field type-string field-Dinfo')[0].innerHTML;"
    end tell

【问题讨论】:

    标签: variables safari applescript


    【解决方案1】:

    没有看到完整的代码,我无法确定发生了什么。但是从你的函数名称来看——getInputByClass2——我假设你正在尝试获取 HTML <input> 字段的值。如果这是真的,您应该使用outPut.push(arr[i].value) 而不是outPut.push(arr[i].innerHTML)

    至于第二段代码,如果document.getElementsByClassName(' field type-string field-Dinfo ')[0] 的值为null,您的JavaScript 没有任何错误处理。

    var els = document.getElementsByClassName(' field type-string field-Dinfo ');
    //set to value of [0].innerHTML if [0] exists, else empty string
    var html = els.length ? els[0].innerHTML : ""; 
    //return value to AppleScript
    html; 
    

    更新(响应更新的问题)

    在脚本编辑器中针对此 StackOverflow 页面运行以下脚本将返回正确的值(假设您设置了正确的窗口/选项卡编号)。如果此 StackOverflow 页面顶部的搜索字段为空,您将获得一个空字符串。如果您输入一个术语(但不提交)然后运行 ​​AppleScript,您将获得该字段的值。

    tell application "Safari"
        set DinfoGrab to do JavaScript "
    document.getElementsByClassName('js-search-field')[0].value;" in tab 1 of window 1
    end tell
    

    脚本中唯一的更改是窗口/选项卡编号、类名(更改为与 StackOverflow 页面匹配),并且我使用了 value 而不是 innerHTML

    我已经在最新版本的 Safari (10.0.3) 中测试过;如果这在您的 Safari 版本中不起作用,请确保您指向正确的类名。如果此脚本确实为您工作,那么问题可能是由于您尝试搜索的页面上的某些内容,可能与您正在获取的 <input> 字段的类型或不正确的类名有关。也许对 Safari 的更新导致页面呈现不同,这间接影响了您的代码。

    【讨论】:

    • 感谢您的回复,虽然以前的脚本可以正常工作大约一年,但我还是尝试更改为 .value 但后来我的 Safari 出现错误:无法制作“文档.getElementsByClassName('字段类型-字符串字段-dsid ')[0].value;"输入文本。
    • 我首先要检查的是 document.getElementsByClassName(' field type-string field-dsid ')[0] 的 typeof:alert(typeof document.getElementsByClassName(' field type-string field-dsid ')[0])。至少你会知道document.getElementsByClassName(' field type-string field-dsid ')[0]) 是否真的返回了任何有用的东西
    • 我更新了与 Chrome 相同的脚本,我想这是我的 Safari 版本的问题。我也没有设法运行你的代码,我可能应该找个时间学习更多 JavaScript
    • 感谢更新,表单和文本字段不是“.value”吗?你的脚本工作正常,连同我的脚本和我的另一台 Mac(使用 StackoverFlow 搜索)但不在我的电脑上,我有错误 Safari 出现错误:无法将“..... 输入文本. , 另外我正在运行 Safari 10.1 (12603.1.29) 我认为是从 10.1 开始出现问题
    • 是的,value 用于表单 <input> 元素。正如我在回答中提到的,我假设您正在抓取 <input> 元素,因为您的函数名为 getInputByClass2。如果您不抓取 <input> 元素,而只是抓取标准 HTML 元素(如 <div>),则可以使用 innerHTML
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 2012-09-16
    • 2019-05-03
    • 2015-05-07
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多