1

我已经使用了 WebAii 测试框架的免费版本(Art Of Test 在被 Telerik 收购之前发布的那个),所以我知道它基本上可以工作。所以我现在遇到的问题对我来说完全莫名其妙。

我正在尝试在现有站点中测试导航,并浏览一系列页面。我进入一个有(除其他外)两个按钮的页面。一个是“后退”按钮,它是按钮类型的输入元素,带有一个 onclick 处理程序,它调用一个只调用 history.back() 的 JavaScript 函数。另一个是提交按钮。

WebAii 找到提交按钮没有问题。但是当我告诉它点击它时,它显然是点击后退按钮。

以下是该网站的相关 HTML:

<div align="right"> 
    <table border="0" width="200" cellpadding="8" style="border-collapse: collapse" bordercolor="#E0DFE3"> 
        <tr> 
            <td> 
                <input type="button" value="<- Back" name="B2" onclick="cancelChange()" > 
            </td> 
            <td> 
                <input type="submit" value="Maint Details ->" name="lnkSubmit"> 
            </td> 
        </tr> 
    </table> 
</div> 

这是测试代码:

        HtmlInputSubmit maintDetailsButton = Find.ByAttributes<HtmlInputSubmit>("value=Maint Details ->"); 
        maintDetailsButton.Click(); 

        Assert.IsTrue(ActiveBrowser.Url.Contains(expectedPage), "URL {0} does not contain expected page {1}", ActiveBrowser.Url, expectedPage); 

当我手动单击它时,操作顺序工作得很好,所以我看不到任何证据表明这是站点的问题。我已经看到大量证据表明实际上是单击“返回”按钮而不是“维护详细信息”按钮。(Fiddler 显示在发送点击请求时没有发出任何请求 - 与执行 history.back() 一致,因为浏览器只是从它的缓存中重新显示。当我点击时,它确实会转到上一页。最后,如果我从后退按钮中删除“onclick”属性,以便单击按钮什么都不做,那么在执行测试代码时,站点什么也不做——只是停留在当前页面上。)

我完全感到困惑。谁能给我一个提示?

4

1 回答 1

2

好吧,我花了一周的时间把头撞在墙上,但我确实明白了这一点。

首先,我发现了一些东西。根据我的推断,当您执行 Find. 时,WebAii 会跟踪该元素作为文档中该类型所有元素列表的索引。然后,每当您访问找到的元素时,WebAii 都会生成“document.GetElementsByTag('')[]”形式的 JavaScript 函数。当我试图找到一种方法来识别 WebAii 找到的元素时,我意外地发现了这一点,并且无意中生成了一个 javascript 错误,该错误显示了它试图在异常中执行的函数。所以,然后我推断,如果它通过索引访问元素,并且它的索引以某种方式关闭,那么它在我想要的那个之前单击输入元素是有意义的。所以我做了一个 Find.AllByTagName("input"), 并在 VS 调试器中查看生成的 ReadOnlyCollection,并开始将它找到的输入元素与我在查看页面的查看源代码时可以识别的内容进行匹配。我发现我在页面顶部附近找到了 WebAii 没有列出的一个,并且在仔细检查后发现缺少的输入元素缺少它的右尖括号。所以,显然 WebAii 没有发现它作为输入元素,但 javascript 发现了。因此,当我的测试说“maintDetails.Click()”时,它被转换为“document.GetElementsByTag('input')[20].click()”之类的东西,由于缺少元素,它应该是“document.GetElementsByTag('input')[21].click()”。并开始将它找到的输入元素与我在查看页面的查看源代码时可以识别的内容进行匹配。我发现我在页面顶部附近找到了 WebAii 没有列出的一个,并且在仔细检查后发现缺少的输入元素缺少它的右尖括号。所以,显然 WebAii 没有发现它作为输入元素,但 javascript 发现了。因此,当我的测试说“maintDetails.Click()”时,它被转换为“document.GetElementsByTag('input')[20].click()”之类的东西,由于缺少元素,它应该是“document.GetElementsByTag('input')[21].click()”。并开始将它找到的输入元素与我在查看页面的查看源代码时可以识别的内容进行匹配。我发现我在页面顶部附近找到了 WebAii 没有列出的一个,并且在仔细检查后发现缺少的输入元素缺少它的右尖括号。所以,显然 WebAii 没有发现它作为输入元素,但 javascript 发现了。因此,当我的测试说“maintDetails.Click()”时,它被转换为“document.GetElementsByTag('input')[20].click()”之类的东西,由于缺少元素,它应该是“document.GetElementsByTag('input')[21].click()”。我发现我在页面顶部附近找到了 WebAii 没有列出的一个,并且在仔细检查后发现缺少的输入元素缺少它的右尖括号。所以,显然 WebAii 没有发现它作为输入元素,但 javascript 发现了。因此,当我的测试说“maintDetails.Click()”时,它被转换为“document.GetElementsByTag('input')[20].click()”之类的东西,由于缺少元素,它应该是“document.GetElementsByTag('input')[21].click()”。我发现我在页面顶部附近找到了 WebAii 没有列出的一个,并且在仔细检查后发现缺少的输入元素缺少它的右尖括号。所以,显然 WebAii 没有发现它作为输入元素,但 javascript 发现了。因此,当我的测试说“maintDetails.Click()”时,它被转换为“document.GetElementsByTag('input')[20].click()”之类的东西,由于缺少元素,它应该是“document.GetElementsByTag('input')[21].click()”。

我修复了站点源代码中缺少的右尖括号,然后测试运行了。

于 2010-07-01T20:12:08.477 回答