title: Driving a Windows GUI program from a script
body: <p>I have to use a Windows simulation package to perform a repetitive task with slightly different options each time. </p>
  
  <p>Since I hate repetitive clicking, on grounds of both laziness and the amount of errors that a human introduces, I would like to drive this program automatically. The program in question doesn't support scripting, there is no API, no COM, nada, nyet, nravin. As far as I can tell, the only way to drive this program automatically is to imitate a human (i.e. keyboard and mouse macros.)</p>
  
  <p>I am aware of AutoHotKey but I don't think it does what I want. (Or it might do what I want, but its scripting language is horrible.)</p>
  
  <p>The requirements are:</p>
  
  <ul>
  <li><p>Must allow time delays between actions, or event detection to trigger actions.</p>
  
  <p>The simulations can take up to ten minutes to run, so the GUI driver would have to wait until the simulation finishes before starting a new one.</p>
  
  <p>One way to do this would be to just wait ten minutes and hope that the simulation has finished. An alternative way is to make it event-driven, i.e. watch for the "Simulation running..." dialog to disappear and be replaced by a "Simulation complete" dialog.</p></li>
  <li><p>Must allow composition of complex keyboard input.</p>
  
  <p>Some of the keyboard input required is different for each simulation run. For example the simulation description might take the format <code>[Project name][Scenario name][Option 1][Option 2]...</code> and this would have to be entered for each simulation.</p>
  
  <p>I am aware that AutoHotKey allows a basic level of input customisation, but my casual reading of the documentation makes the scripting language look like some kind of eldritch horror.</p></li>
  <li><p>This is for work, so any solution must be free for commercial use.</p></li>
  </ul>
  
  <p>I will accept any solution that fits the criteria above, but I have a <strong>strong</strong> preference for something I can drive from Python. However I would also accept automated GUI-testing tools that I could customise to do what I want - possibly a Win32 GUI equivalent of <a href="http://seleniumhq.org/">Selenium</a> for browsers? - keyboard macro recorders that will generate custom output, or anything else that works.</p>