0
votes

I want to use Python (3.6) and pywinauto (0.6.3) to control Google Earth (7.1.8.3036) in the Windows 10 platform to save the Google Earth image to a file. I am able to start Google Earth from pywinauto and get the Google Earth dialog but could not find the attribute for 'File'. I did try use app['Google Earth'].print_control_identifiers() but could not see any attribute for 'File' (to long to include here).

I appreciate any help or suggestion how to do app['Google Earth'].???('File -> Save -> Save Image...'). A simple alternate is to use hot keys (Ctrl+Alt+S) on the active Google Earth window. I did try using SendKeys('^%S') or type_keys('^%S'), but those did not work. I must not do something right.

Here how I tried to start Google Earth and find out if there was any attribute for 'File':

app = Application(backend='uia').start('c:/Program Files (x86)/Google/Google Earth/client/googleearth.exe')

app['Google Earth'].File.click()

Traceback (most recent call last): File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 245, in __resolve_control criteria) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\timings.py", line 447, in wait_until_passes raise err pywinauto.timings.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "", line 1, in File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 351, in getattribute ctrls = self.__resolve_control(self.criteria) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 248, in __resolve_control raise e.original_exception File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\timings.py", line 425, in wait_until_passes func_val = func(*args) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 209, in __get_ctrl ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria)) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findwindows.py", line 84, in find_element elements = find_elements(**kwargs) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findwindows.py", line 300, in find_elements elements = findbestmatch.find_best_control_matches(best_match, wrapped_elems) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findbestmatch.py", line 533, in find_best_control_matches raise MatchError(items = name_control_map.keys(), tofind = search_text) pywinauto.findbestmatch.MatchError: Could not find 'File' in 'dict_keys(['Tour GuidePane', 'Tour Guide', 'Pane', '', 'Custom', '0', '1', '2', 'Pane0', 'Pane1', 'Pane2', '3', 'Pane3', '4', 'Pane4', '5', 'Pane5', '6', 'Pane6', '7', 'Custom0', 'Custom1', 'Custom2', '8', 'Custom3', '9', 'Custom4', '10', 'Custom5', '11', 'Custom6', '12', 'Custom7', '13', 'Custom8', '14', 'Custom9', '15', 'Custom10', '16', 'Custom11', '17', 'Custom12', '18', 'Custom13', '19', 'Custom14', '20', 'Custom15', '21', 'Custom16', '22', 'Custom17', '23', 'Custom18', '24', 'Custom19', '25', 'Custom20', '26', 'Custom21', '27', 'Custom22', '28', 'Custom23', '29', 'Custom24', '30', 'Custom25', '31', 'Custom26', '32', 'Custom27', '33', 'Custom28', '34', 'Custom29', '35', 'Custom30', '36', 'Custom31', '37', 'Custom32', '38', 'Custom33', '39', 'Custom34', '40', 'Custom35', '41', 'Custom36', '42', 'Custom37', '43', 'Custom38', '44', 'Custom39', '45', 'Custom40', '46', 'Custom41', '47', 'Custom42', '48', 'Custom43', '49', 'Custom44', '50', 'Custom45', '51', 'Pane7', '52', 'Pane8', '53', 'Pane9', '54', 'Pane10', '55', 'Pane11', '56', 'Pane12', '57', 'Pane13', '58', 'Pane14', '59', 'Custom46', '60', 'Custom47', '61', 'Custom48', '62', 'Custom49', '63', 'Custom50', '64', 'Custom51', '65', 'Custom52', '66', 'Custom53', '67', 'Custom54', '68', 'Custom55', '69', 'Custom56', '70', 'Custom57', '71', 'Custom58', '72', 'Custom59', '73', 'Custom60', '74', 'Custom61', '75', 'Custom62', '76', 'Custom63', '77', 'TitleBar', 'System', 'SystemMenu', 'Menu', 'System0', 'System1', 'System2', 'SystemMenuItem', 'MenuItem', 'Minimize', 'MinimizeButton', 'Button', 'Maximize', 'MaximizeButton', 'Button0', 'Button1', 'Button2', 'CloseButton', 'Close', 'Button3'])'

1
Welcome to Stack Overflow At this site you are expected to try to write the code yourself. After doing more research, if you have a problem you can post what you've tried with a clear explanation of what isn't working and providing a Minimal, Complete, and Verifiable example. I suggest reading How to Ask a good question and the perfect question. Also, be sure to take the tour and read this.Vishal Chhodwani
First you need to expand "File" submenu. Google Earth is a Qt5 app so you can take a look at the WireShark example in the repo for guidance (it's also Qt5). Submenu can be expanded by .invoke() for this case.Vasily Ryabov

1 Answers

0
votes

I found a way to save an image of a KML file in the Google Earth by using hot keys (Ctrl+Alt+S). But this defeats the key purpose of using pywinauto. I am still looking for a better way to utilize pywinauto to control Google Earth. Here is my python code along with comments:

import os, time
from pywinauto import Application
from pywinauto import keyboard

kmlfile = 'rcglic1457645225.kml'
kmlimage= kmlfile[:-3]+'jpg'
os.startfile(kmlfile)
time.sleep(15)      #wait for completely loading Google Earth

app = Application(backend='uia').connect(path='googleearth.exe')    #connect to the Google Earth process
dlg = app['Google Earth']   #connect to the Google Earth dialog
dlg['Maximize'].click()     #click on 'Maximize' button of the Google Earth window to have the best image
time.sleep(1)
keyboard.SendKeys('^%S')    #hot keys to save the image (Ctrl+Alt+S)
keyboard.SendKeys(kmlimage+'{ENTER}')   #enter the image file name
keyboard.SendKeys('{TAB}{ENTER}')       #use TAB to select 'Yes' and replace file if existed
dlg['Restore'].click()      #click on 'Restore' button of the Google Earth window to go back to normal
dlg['Close'].click()            #click on 'Close' button
keyboard.SendKeys('{TAB}{ENTER}')       #use TAB to select 'Discard' and close the Google Earth window