2016-12-29 53 views
0

试图返回聊天室中的用户列表。该HTML看起来像:如何在AppleScript中使用JavaScript来返回聊天室中的用户列表

<div class="users-list" style="height: 475px; display: block;"> 

一个可扩展到这一点:

<div class="text" data-nick style="float:right">...</div> 
<div class="text" data-nick="user1">...</div> 
<div class="text" data-nick="user2">...</div> 
<div class="text" data-nick="user3">...</div> 
<div class="text" data-nick="user4">...</div> 

使用谷歌浏览器的JavaScript控制台,我做的:

document.body.querySelector("div.users-list") 

它返回原来未发泡的HTML:

<div class="users-list" style="height: 475px; display: block;"> 

有一个下拉箭头,返回用户列表中的JavaScript控制台扩展此:

<div class="text" data-nick style="float:right">...</div> 
<div class="text" data-nick="user1">...</div> 
<div class="text" data-nick="user2">...</div> 
<div class="text" data-nick="user3">...</div> 
<div class="text" data-nick="user4">...</div> 

我想要做的是用户列表写入一个文本文件中。我试图用猛砸做osascript此:

osascript -e \ 
'tell application "Google_Chrome" 
    tell window 1 
     tell active tab 
      execute javascript "document.body.querySelector(\"div.users-list\")" 
     end tell 
    end tell 
end tell' 

但是,当我在终端运行这个它返回一个空行。当我在脚本编辑器中将它作为AppleScript运行时,它只返回{}

如何使用AppleScript/osascript中的javascript "document.body.querySelector(\"div.users-list\")"返回使用Google Chrome中的JavaScript控制台返回的相同扩展用户列表?

回答

1

Element.querySelector不返回字符串(HTML或其他);它返回一个Element对象。 Chrome在控制台中使用文本进行渲染,但AppleScript/osascript可能会以不同的方式渲染它,或根本不渲染。

你可能要考虑使用innerHTML,它返回的内容的HTML作为字符串:

execute javascript "document.body.querySelector(\"div.users-list\").innerHTML" 

由于对字符串数组的适当的渲染,我们可以映射每个在div.users-list一些字符串的孩子,使用Array.prototype.map方法:

execute javascript "[...document.querySelector(\"div.users-list\").children].map(x => x.outerHTML)" 

(这也使得使用spread syntaxarrow functions


当然,你也可以从内部地图中的每个子格中提取信息并返回信息。下面使用dataset阅读HTML5 data-*属性:

execute javascript "[...document.querySelector(\"div.users-list\").children].map(x => x.dataset.nick)" 

和将输出:

用户1,用户2,用户3,USER4

+0

使用' “document.body.querySelector(\” div.users-list \“)。innerHTML”'现在产生输出。但是,它似乎是一个长串。有没有一种方法可以将输出保持为列表形式? –

+0

@ I0_ol你能输出一个Javascript数组吗?如果你执行''执行javascript'[\“a \”,\“b \”]“'会发生什么?如果是,那么我会以某种方式利用Javascript ['Array.prototype.map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)函数,将每个节点映射为一个字符串。 –

+0

执行javascript的输出是'a,b' –

相关问题