Web 应用程序用户界面低层测试自动化(3)

发表于:2011-11-11来源:未知作者:领测软件测试网采编点击数: 标签:自动化测试
ie = (InternetExplorer)allBrowsers.Item(0); 你实际采用何种方法取决于你的实际测试场景。既然我建立了我的测试InternetExplorer对象,我能注册我之前提到的Document

  ie = (InternetExplorer)allBrowsers.Item(0);

  你实际采用何种方法取决于你的实际测试场景。既然我建立了我的测试InternetExplorer对象,我能注册我之前提到的DocumentComplete事件句柄:

  ie.DocumentComplete += new

  DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);

  简单来说,当InternetExplorer的DocumentComplete事件发生时,调用用户定义的ie.DocumentComplete方法。如果你回头去看图3中的代码,你能看到我如此定义了该方法:

  private static void ie_DocumentComplete(object pDisp, ref object URL)

  {

  documentComplete.Set();

  }

  ie_DocumentComplete 方法调用了我早些时候在测试类中定义的AutoResetEvent对象中的Set方法。简而言之,现在我能暂停我的执行线程,直到我的InternetExplorer对象充分装载了。我会立即向你展示怎样具体做这件事情。现在我浏览正在进行测试的Web应用程序,等到应用程序充分装载:

  Console.WriteLine("\nNavigating to the Web app");

  object missing = Type.Missing;

  ie.Navigate("http://localhost/LowLevelWebUIAutomationApp/WebForm1.aspx",

  ref missing, ref missing, ref missing, ref missing);

  documentComplete.WaitOne();

  我使用InternetExplorer.Navigate方法来装载我的Web应用程序。Navigate接受数个可选参数,但是在这个例子中,我不需要任何参数。注意,我调用了documentComplete对象的WaitOne方法。WaitOne将停止我的执行线程,直到应用程序充分装载到了Internet Explorer中。在这个例子中,我没有提供一个超时值,所以我会不停的等待,但你很可能会向WaitOne传递一个代表超时毫秒数的整型值。下一步我设定Internet Explorer为一个固定的大小,并获得Web应用程序文档的一个引用。

  Console.WriteLine("Setting IE to 525x420");

  ie.Width = 525;

  ie.Height = 420;

  HTMLDocument theDoc = (HTMLDocument)ie.Document;

  我声明了一个HTMLDocument变量,并为它指定了一个值。HTMLDocument接口是在mshtml名字空间中定义的。我怎么知道呢?图4是Visual Studio .NET对象浏览器的一个屏幕截图。我扩展mshtml interop到汇编层,看到了它们的所有接口、类、事件和其他对象。

  图 4对象浏览器

  下一步,我模拟了对“Last Name”单选按钮的检查,向文本框控件中输入“urk”:

  Console.WriteLine(

  "\nSelecting ''Last Name'' radio button");

  HTMLInputElement radioButton =

  (HTMLInputElement)theDoc.getElementById("RadioButtonList1_0");

  radioButton.@checked = true;

  Console.WriteLine("Setting text box to ''urk''");

  HTMLInputElement textBox =

  (HTMLInputElement)theDoc.getElementById("TextBox1");

  textBox.value = "urk";

  这两段代码是非常相似的,并且看起来相当明白。我通过getElementByID方法获得了HTMLInputElemen对象的引用。在拥有这个对象之后,我能使用它的属性或方法来操纵它。这里我选择单选按钮控件的“checked”属性(因为在C#中checked是一个保留字,我必须使用“@checked”)和文本框控件的“value”属性。按你下面看到的方式点击Search按钮:

  Console.WriteLine("Clicking search button");

  HTMLInputElement button =

  (HTMLInputElement)theDoc.getElementById("Button1");

  button.click();

  documentComplete.WaitOne();

  在这个例子中,我需要调用WaitOne方法来确保表示搜索结果的页面被充分装载了。通过一些很小的实验,你会发现你能虚拟操纵任何HTML元素。例如,我能模拟下拉框的选择、超链接的点击,当然在这个测试场景中我无需这样做。在我操作Web应用程序之后,我必须检查最终状态的正确性。

  Console.WriteLine("\nSeeking ''Burke, Brian'' in list box");

  HTMLSelectElement selElement =

  (HTMLSelectElement)theDoc.getElementsByTagName(

  "select").item(0, null);

  if (selElement.innerText.ToString().IndexOf("Burke, Brian") >= 0)

  {

  Console.WriteLine("Found target string");

  pass = true;

  }

  else

  {

  Console.WriteLine("*Target string not found*");

  }

  一般模式是通过共同的标签名获得一个HTML元素集的引用,然后使用属性得到某一特定元素,然后获取表示该元素头标签和尾标签之间数据串的innerText。这里,我获得了所有元素——当然,也是我的Web页面中唯一的