title: How can I optimize Robot Framework to speed up testing of an Angular application?
body: <p>I know the basics of optimizing Robot Framework for speed on normal applications, but this is not a normal application. It's not a question of going as fast as possible, because if the code executes too fast on an Angular application, it'll try to click an element that isn't enabled or visible, or an element that doesn't exist yet. Timing issues abound, and the result is that I'm using a keyword (below) to slow down my program universally. The problem is that it's hard-coded, and I'm looking for a more "programatic" (programatical? I don't know the exact term) solution that will wait for an element to be clickable and then click it as soon as it is.</p>
  
  <p>This is the keyword I use after every single click (<code>${SLOW_TIME}</code> is a global variable set to <code>0.5s</code>):</p>
  
  <pre><code>Slow Down
      #   EXAMPLE USAGE
      #   Slow Down   ${SLOW_TIME}
      [Arguments]     ${SLOW_TIME}
      Sleep           ${SLOW_TIME}
  </code></pre>
  
  <p>This is my current solution, which was written to verify that an element is ready to be clicked for test verification purposes, not speed. It's not complete (needs "Is Clickable") and occasionally causes the program to wait longer than it has to:</p>
  
  <pre><code>Verify Element Is Ready
      #   EXAMPLE USAGE
      #   Verify Element Is Ready     id=myElementId
      #   Click Element               id=myElementId
      [Arguments]                     ${element}
      Variable should exist           ${element}
      Wait until element is visible   ${element}
      Wait until element is enabled   ${element}
  </code></pre>
  
  <p>I'm aware that Robot Framework isn't built for speed, but for long tests I'm tired of doing nothing for 10 minutes waiting for it to finish, only to see that I have an incorrect <code>[Fail]</code>. If the solution involves Python, Javascript, or Java, I can work that in.</p>
  
  <p>EDIT: I'm currently using ExtendedSelenium2Library, but its implicit waits don't always work, so I wanted a second layer of waiting, but only as long as necessary.</p>