Why does KM not get the CORRECT browser title?

Yes there is some dawdling going on there.

Even with the recommended Switch or Case action, I still don't get the GoogleTitle, although in a precedent test with Safari, I got the SafariTitle.

Here is a screenshot:

And also the complete macro:

Send to all-touched-pages-projects 1 paragr. vs.2 Chr-Saf.kmmacros (7.3 KB)

(I don't know how to upload a macro and put it in an existing forum thread.)

/
with best regards,
Omar KN
Stockholm, Sweden

Hi Omar,

I'm afraid I don't have time at the moment to point out where I think you may have erred with your macro, but I was able to take the liberty of making some adjustments to it to help you achieve what I believe is your desired result in a hopefully simpler manner. Please try this out and see if it works any better.

Send to all-touched-pages-projects 1 paragr. vs.2 Chr-Saf.kmmacros (8.1 KB)

%Application%1% will presumably never be “Chrome” since the application name is “Google Chrome”.

I’d recommend using “contains” and “Google Chrome”.

Almost solved - so I thought!

Did that (contains G C), ok now - thank you @peternlewis .

Also thanks to @gglick for rewriting the macro.

At one point when copying from Safari, the copied text was correct but the URL & TITLE were from another SAFARI page behind the one I was currently using. I could reproduce this once, but thank God - the macro is working now as it should.

I’d like to share the macro with the community, where to upload it?

/
with best regards,
Omar KN
Stockholm, Sweden

Several times, and just now every time, when copying from Safari/ Chrome, the copied text was correct but the URL & TITLE were from another SAFARI/ Chrome page behind the one I was currently using. I could reproduce this.

When this happens with Chrome, Safari copy was 100% correct, but before when it happened with Safari, Chrome was 100% correct.

This happened even after restarting the KM engine and KM itself.

Now when I make sure that only 1 browser page is available everything is fine - obviously. Another browser tab or a newly opened secondary browser page does not matter.

So is this a cache problem somewhere?

/
Any assistance would be greatly appreciated!

With best regards,
Omar K N

I have not seen the issue/behavior you are reporting.

Maybe this macro would be of some help that I wrote back in 2015 that gets the Web Page Title and URL of the frontmost browser and it's frontmost window:

Get the Browser Page Title & URL for Safari, Chrome, or FireFox

Share it to the Macro Library category by using the Share to Forum button at the top of the main window. Ensure you have the macro selected.

The actions are all based around AppleScript, along the lines of:

tell app "Safari" to tell window 1 to …

So if it is selecting the wrong window, it would only be because the system is selecting the wrong window.

I have never heard of this happening, so if it is happening to you I would suggest either something is corrupted in the windowing system (reboot), you are misunderstanding something (eg multiple displays, spaces, whatever), or there is some software installed on your Mac that is mucking with the windowing system and screwing things up.

Sorry if I did't clarify: the current update of the macro is solely based on KM modules, vs. 3,
essentially based on @gglick's rewrite:
(Send to all-touched-pages-projects + 1 paragr. vs.3 Chr-Saf)

It seems to be ok right now - after reboot.

Send to all-touched-pages-projects 1 paragr. vs.3 Chr-Saf.kmmacros (8.8 KB)

/
with best regards,
Omar KN
Stockholm, Sweden

Yes, the Keyboard Maestro tokens for SafariTitle etc are all based on AppleScript. It is essentially:

tell application "Safari" to tell document 1 to set r to do JavaScript "document.title"

Its more complicated that that because it deals with stuff like Safari not running, but it is essentially just asking Safari to do the job. There isn't any scope for accidentally picking the wrong window - not on Keyboard Maestro's end anyway, and it should be largely impossible on the other end too.

Glad my rewrite proved useful, and that your issues with unexpected URLs and titles seem to have been resolved!

Hey Folks,

Over and over again I’ve mentioned that various apps including Safari fail to properly understand the concept of FRONT WINDOW or WINDOW 1 IF the app has been hidden with “Hide <App-Name>” or “Hide Others”.

Google Chrome has the same problem.

This is an idiotic and horrible bug Apple has elected to NOT fix for about a decade…

The workaround goes like this:

tell application "System Events"
   tell application process "Safari"
      if visible is false then set visible to true
   end tell
end tell

While I’m not certain this issue is the crux of the problem with Omar’s macro, it has caused many users more than a little head-scratching time.

-Chris

1 Like

Again this morning I have run into the same problem and it can be reproduced:

The text section copied from Safari or G Chrome is correct, but if there are more than 1 browser pages the URL and the TITLE are caught from another (hidden) page. (Not always - but right now.)
(There have been reboots in between).

So thanks to Chris I included the above AppleScript into the macro, but to no avail :frowning:
(See screendump below) - maybe not at right position?

It's probably not KM's fault.

So the page from which I'm copying is not hidden, it's on top, but what I get is the URL and the TITLE from the 2nd or 3rd page "under" my top page (hidden).

If all other, hidden pages are closed, the macro works ok.

/
OmarKN
The macro as it is now:

Send to all-touched-pages-projects 1 paragr. vs.3 Chr-Saf.kmmacros (10.3 KB)

I can't seem to reproduce your issue on my own system (10.12.4, KM 7.3.1) but I did think of a workaround that should avoid any possible issues caused by the current Safari or Chrome tab not being the frontmost window. Try this version out and see if it makes any difference.

Send to all-touched-pages-projects 1 paragr. vs.3 Chr-Saf.kmmacros (6.5 KB)

@gglick

You’re using a variable ( tppLog ) for the top stripe (URL, TITLE etc.) and it works.

So far I have not been able to see anything fishy!

And I’m not complaining! :wink:

Thank you so far, :+1: :+1: :+1:

/
with best regards,
Omar KN
Stockholm, Sweden

1 Like

Hey Omar,

That script will do NOTHING with so-called “hidden” windows. It ONLY makes HIDDEN applications visible.


NOTE:

Any window that has been minimized or turned into a full-screen window is at the mercy of the system and may or may NOT be available to a normal scripted solution. You have to test to be sure of these things.

Because of Apple's ham-handed handling of Spaces I rarely use them — particularly since they can interfere with scripting.

Rule-of-the-thumb — never, ever use the Clipboard when a more direct means of getting the selection is available.


Here's now I'd handle your task.

Since you're dealing with plain-text it's relatively simple to gather all your required data using some AppleScript, some JavaScript – then massage the data a little and write it to a file with the Satimage.osax.

This method should be lightning-fast and very reliable.

NOTE — You the user need to set the variable logFilePath to the correct POSIX Path. If the target file does not exist the script will fail.

------------------------------------------------------------------------------
# Auth: Christopher Stone
# dCre: 2017/05/06 02:00
# dMod: 2017/05/07 08:23
# Appl: Google Chrome & Safari
# Task: Write Selected Text to a Log File with an Info-Header.
# Libs: None
# Osax: Satimage.osax --> http://tinyurl.com/satimage-osaxen
# Tags: @Applescript, @Script, @System_Events, @Write, @Selected, @Text, @Log, @File, @Info-Header, @Header
# Vers: 1.02
------------------------------------------------------------------------------

# Note: This script REQUIRES the Satimage.osax AppleScript Extension to be INSTALLED!!!!

------------------------------------------------------------------------------

try
   
   set logFilePath to "~/Documents-LC3/_loggar/my-touched-pages-IN.txt" -- POSIX-Path or Tilde-POSIX-Path
   
   tell application "System Events" to set logFilePath to POSIX path of disk item logFilePath
   set logDate to current date
   set logDate to strftime logDate into "logged tpp %m/%d/%Y %H:%M =="
   
   set pathToFrontAppHFS to path to frontmost application as text
   
   if pathToFrontAppHFS ends with "Google Chrome.app:" then
      
      set theApp to "Chrome"
      set documentTitle to doJavaScriptInChrome("document.title")
      set documentURL to doJavaScriptInChrome("document.URL")
      set selectedText to doJavaScriptInChrome("window.getSelection()+'';")
      if selectedText = "" then error "No text was selected in Chrome!"
      set selectedText to cng("\\A\\s+|\\s+\\Z", "", selectedText) of me
      
   else if pathToFrontAppHFS ends with "Safari.app:" then
      
      set theApp to "Safari"
      set documentTitle to doJavaScriptInSafari("document.title")
      set documentURL to doJavaScriptInSafari("document.URL")
      set selectedText to doJavaScriptInSafari("window.getSelection()+'';")
      if selectedText = "" then error "No text was selected in Safari!"
      set selectedText to cng("\\A\\s+|\\s+\\Z", "", selectedText) of me
      
   else
      
      error "Google Chrome or Safari must be the frontmost app!"
      
   end if
   
   set logText to join {logDate, "URL: " & documentURL, documentTitle, "", selectedText, "", ""} using linefeed
   set outputText to logText & (readtext logFilePath)
   writetext outputText to logFilePath
   
   display notification "Log text written!" with title theApp subtitle "" sound name "Tink"
   
on error e number n
   stdErr(e, n, true, true) of me
end try

------------------------------------------------------------------------------
--» HANDLERS
------------------------------------------------------------------------------
on cng(_find, _replace, _data)
   change _find into _replace in _data with regexp without case sensitive
end cng
------------------------------------------------------------------------------
on doJavaScriptInChrome(jsCMD)
   try
      tell application "Google Chrome" to tell front window's active tab to execute javascript jsCMD
   on error e
      error "Error in handler doJavaScriptInChrome() of library NLb!" & return & return & e
   end try
end doJavaScriptInChrome
------------------------------------------------------------------------------
on doJavaScriptInSafari(jsCMD)
   try
      tell application "Safari" to do JavaScript jsCMD in front document
   on error e
      error "Error in handler doJavaScriptInSafari() of library NLb!" & return & return & e
   end try
end doJavaScriptInSafari
------------------------------------------------------------------------------
--» HANDLERS
------------------------------------------------------------------------------
on stdErr(e, n, beepFlag, ddFlag)
   set e to e & return & return & "Num: " & n
   if beepFlag = true then
      beep
   end if
   if ddFlag = true then
      tell application (path to frontmost application as text)
         set dDlg to display dialog e with title "ERROR!" buttons {"Cancel", "Copy", "OK"} default button "OK" with icon 0
      end tell
      if button returned of dDlg = "Copy" then set the clipboard to e
   else
      return e
   end if
end stdErr
------------------------------------------------------------------------------

-Chris

Hi and good day Chris,

How does one know the Satimage.osax AppleScript Extension is correctly installed & functional?

I downloaded it ( XMLLib osax 3.7.0 (build 390) from http://www.satimage.fr/ .

When testing your script with Script Debugger

a.) there was the error: ”The variable documentURL is not defined.”

b.) At the start I changed the path to the fixed one (POSIX Path gave an error):
set logFilePath to “/Volumes/LC3/Documents-LC3/_loggar/_tpp/my-touched-pages-IN.txt”

So maybe the plugin is not even installed correctly. I only find the XMLLib371.pkg installer package, not the unpacked folder(s).

/
with best regards,
Omar KN
Stockholm, Sweden

You should find it here:
/Library/ScriptingAdditions Satimage.osax
This script will list all Scripting Additions that are installed in the proper locations:

(*
LIST SCRIPTING ADDITIONS

The following script will create a neatly formatted string describing the contents of all of your ScriptingAdditions folders:

REF:  KINDLE BOOK:  Sanderson, Hamish; Rosenthal, Hanaan (2010-05-05). Learn AppleScript: The Comprehensive Guide to Scripting and Automation on Mac OS X (Learn (Apress)) (Kindle Locations 15946-15947). Apress. Kindle Edition. 
*)


set osax_info to {}
set folderList to {}

tell application "System Events"
  set osax_folders to scripting additions folder of every domain
  repeat with folder_ref in reverse of osax_folders
    if (contents of folder_ref is not missing value) then
      set AppleScript's text item delimiters to return & tab
      set end of folderList to POSIX path of folder_ref
      set end of osax_info to POSIX path of folder_ref & return & tab & (name of every file of folder_ref whose visible is true)
    end if
  end repeat
end tell

set AppleScript's text item delimiters to return & return

set oAns to display dialog (osax_info as text) ¬
  buttons {"Open Folder", "Cancel", "OK"} ¬
  default button ¬
  "OK" cancel button ¬
  "Cancel" with title ¬
  "Scripting Additions on Your Mac"

if (button returned of oAns = "Open Folder") then
  
  set osaxFolder to choose from list folderList ¬
    with title ¬
    "Choose ScriptingAdditions Folder to Open" with prompt ¬
    "Choose Folder" default items item 1 of folderList
  
  if (osaxFolder ≠ false) then
    set osaxFolder to alias (POSIX file osaxFolder)
    tell application "Finder" to open osaxFolder
  end if
  
end if

@JMichaelTX :1:
Yes it is installed in the systemwide Library Folder.

Hey Omar,

I see JM has provided a script to report installed Osaxen.

I've uploaded a macro that provides a little bit more information:

Report All Installed Osaxen

First of all — you're saying you've installed the XMLLib.osax NOT the Satimage.osax.

You should be looking for Satimage osax 3.7.0 (build 411) on this page:

http://tinyurl.com/satimage-osaxen

Although I prefer to use the latest build available on the Smile beta page:

Satimage osax 3.7.0 (build 420)
Last update: March 13, 2017

http://tinyurl.com/smile-beta-page

You can't test from Script Debugger, because either Chrome or Safari MUST be frontmost when you run the script.

I've added more error-checking and reporting to the script — now at v1.02.

If you really want to run the script from Script Debugger then you need to know more about scripting to modify it appropriately.

But — you could also run this script from Keyboard Maestro with Chrome or Safari frontmost — and the script in Script Debugger in its frontmost window.

tell application "Script Debugger"
   execute front document
end tell

That's not the full error-string, so I can't begin to guess where you went wrong.

If you searched with Spotlight then you would NEVER find it — unless you happen to know about Apple HIDING all system files from the user — and making it more difficult than necessary to find them.

How to include system files in Finder search results

In my opinion all Mac users should have a find utility that is NOT dependent upon Spotlight and I recommend Find Any File. It's a great value for $6.00 U.S.

So — did you in fact install the Satimage.osax? Or did you install the XMLLib.osax?

If the latter then you'll need to remove it and install the Satimage.osax.

Keep in mind that after installing the Satimage.osax with its installer you'll have only one new .osax file on your system:

/Library/ScriptingAdditions/Satimage.osax

If you mistakenly installed the XMLLib.osax it will be in the same folder:

/Library/ScriptingAdditions/XMLLib.osax

You can just trash it.

Once you've properly installed the Satimage.osax you MUST restart any applications that load Osaxen, such as Script Debugger, the Script Editor, FastScripts, etcetera.

It's not a bad idea to reboot your system, but it's not required if you know what you're doing.

I'm a bit tired, so I might have missed something. Be sure to shoot me any more questions you might have.

-Chris

Hi Chris,

Thank you for the tips, there's much to know!

1.)
I had problems to change this (updated) path to a POSIX path:

/Volumes/LC3/Documents-LC3/_loggar/_tpp/my-touched-pages-IN.txt
(this is working).

2.)
For the header, I did some minor adaptations:

set logText to join {"--------------------------------------------------", logDate, "URL: " & documentURL, "TTL: " & documentTitle, "--------------------------------------------------", "", selectedText, "", ""} using linefeed

…which turns out like this:

So far so good! :relaxed:

/
with best regards,
Omar KN
Stockholm, Sweden