Hi Rachel,
I looked at your code and my current understanding (without seeing what is going on with the actual page) is that it is worth reading the thread I recommended.
In a nutshell: both yours and my code calls WaitPage() method. This method waits for the indication from the browser that it (browser) received the requested page. This means, that after the call to WaitPage the requested page (i.e. .html, .asp, .jsp, or whatever else one) is already received by the browser. But the fact that the page was received by the browser does not mean that the page is displayed to the end-user. In reality, especially with those modern 'fancy' and (over-) scripted applications, the browser starts to produce the content to present and it is possible that it meets some script code that does another request for the data to be included in the page. Note, that this another request has no relation to the page that was requested originally, i.e. the original page is already received and the fact that some script requests some data to be added to the page does not change original page's status (which is already 'ready').
The browser continues to process the script code (and to execute additional requests) until all code is processed and only then the page is displayed to the end user.
But this is not the end of the story, as the browser might receive data asynchronously and modify the contents of the page correspondingly. Note, that these modifications do not change original page's status either.
Summarizing: if you are unlucky (and, most probably, you are like any other tester of the modern web application), then, in your test code, you must wait not only for the page to be received, but you also must explicitly search for and wait for the reasonable amount of time for the object on the page that you need to work with, as this object may appear not when the page is received from the server, but some time later, when the browser executes additional requests and processes additional data.
Hope, the above will help...