7.5 验证Web页面上HTML元素的值
问题
如何验证Web页面上的HTML元素是否具有某个给定值,从而判断测试场景通过与否。
设计
通过InternetExplorer对象的Document属性创建一个引用,这个引用指向Web应用程序的document body。然后通过mshtml.dll库里的getElementByTagName()方法和item()方法得到你想要检查的特定元素。接下来就可以通过InnerText属性取回HTML元素的实际值。
方案
设想某个待测Web页面包含几个<p>元素,以及一个ID为“div2”的<div>元素和一个单独的<select>元素。下面的代码将在<p>元素中查找“aloha”,在<div>元素中查找“adios”,在<select>元素中查找“ciao”:
bool pass = true;
// 获得HTMLDocument 对象theDoc ——参见7.4节
Console.WriteLine("Seeking 'aloha' in <p>[2]");
HTMLParaElement paraElement =
(HTMLParaElement)theDoc.getElementsByTagName("p").item(2, null);
if (paraElement.innerText.ToString().IndexOf("aloha") >= 0)
{
Console.WriteLine("Found target 'aloha");
}
else
{
Console.WriteLine("*Target string not found*");
pass = false;
}
Console.WriteLine("Seeking 'adios' in <div id='div2'>");
HTMLDivElement divElement =
(HTMLDivElement)theDoc.getElementsByTagName("div").item("div2", null);
if (divElement.innerText.ToString().IndexOf("adios") >= 0)
{
Console.WriteLine("Found target 'adios'");
}
else
{
Console.WriteLine("*Target string not found*");
pass = false;
}
Console.WriteLine("\nSeeking 'ciao' in list box");
HTMLSelectElement selElement =
(HTMLSelectElement)theDoc.getElementsByTagName("select").item(0, null);
if (selElement.innerText.ToString().IndexOf("ciao") >= 0)
{
Console.WriteLine("Found target 'ciao'");
}
else
{
Console.WriteLine("*Target string not found*");
pass = false;
}
item()方法的参数稍微有些麻烦。第一个参数可以是整型(这时候它被解释为从0开始的一个索引值),也可以是字符串(这时候它被解释为tag名字)。item()的第二个参数也是一个索引值,但只有当item()方法返回的是一个集合而不是单个对象(atomic object)的时候,才会用到这个参数。在上述方案中,下面的代码:
getElementsByTagName("p").item(2, null);
得到所有<p>元素的一个集合,然后返回索引值为[2]的特定<p>元素,也就是第3个<p>元素。
注解
我们经常需要通过编程的方式来检查某些待测页面上HTML元素的值,但有时候这些HTML元素的值并不属于任何子的HTML元素。下面这种方法可以解决这个问题:
Console.WriteLine("Seeking 'howdy' in body");
HTMLBody body =
(HTMLBody)theDoc.getElementsByTagName("body").item(0, null);
if (body.createTextRange().findText("howdy", 0, 0) == true)
{
Console.WriteLine("Found target 'howdy'");
}
else
{
Console.WriteLine("*Target string not found*");
pass = false;
}
我们可以得到一个document body的引用并通过textRange对象和它的findText()方法查找特定的字符串。findText()方法有三个参数:第一个参数是必填的目标字符串,后两个是可选参数。第一个可选参数用于指定查找的起始位置。如果该参数为正数,则从textRange的起始位置向前跳过几个字符开始查找。如果该参数为负数,则从textRange的末尾向后跳过几个字符开始查找。如果该参数为0,则从textRange的起始位置开始查找整个字符串。findText()的第二个可选参数用于指定查找的类型,其取值见表7-1:
表7-1 findText()的搜索类型标识
|
值 |
含义 |
|
0 |
部分匹配(默认) |
|
1 |
向后匹配 |
|
2 |
只匹配整个单词 |
|
4 |
大小写敏感 |
|
131072 |
通过比较字节进行匹配 |
|
536870912 |
匹配发音标记(diacritical marks) |
|
1073741824 |
匹配克什米尔(Kashida)字符 |
|
2147483648 |
匹配阿拉伯(AlefHamza)字符 |
这些标识的值是可以进行组合的。因此,下面的调用:
bool result = body.createTextRange().findText("foo", 0, 6);
进行的是针对整个body对象的大小写敏感、全字匹配的查找。请注意,如果第一个可选参数为正数(意味着跳过前面几个字符然后开始向前查找),并且第二个可选参数为1(意味着向后查找),则这两者之间是不一致的。







