如何使用Selenium测试网页
当我使用PHPUnit来隔离和测试应用程序代码时,我们的QA团队一直在使用Selenium测试UI。我听说考试要花10个多小时才能完成,我认为这太长了。然后,我的问题是如何在处理页面时等待AJAX调用 例如,我们有一个包含大量输入的页面,它将调用AJAX调用与我们的服务进行对话,以显示数据。我们有多个输入,然后在后续选择框更改时对其进行过滤 分区都已加载,分区(属于分区)和存储区(属于分区)也是如此 现在,选择框都是最初加载的,因此最终用户可以选择其中的任何一个。但是,一旦选择框具有 选择完成后,AJAX调用将根据父项的选择重新加载其他选择框。IE:然后选择第2部分 地区列表仅针对地区20和21进行过滤(使用服务呼叫),商店列表也进行过滤 去那些地区的商店 如果您跳过选择部门,但选择了一个地区,则门店列表将重新筛选为该地区的门店, 再次在后端使用我们的服务 我的问题是如何知道AJAX调用何时从我们的服务返回,以及选择框何时被更改?我们的QA团队正在等待,然后通过选择框检查所有返回值是否正确。有没有办法让他们知道选择框何时完成重新加载,这样他们就可以检查内容了 显然,我想将这些检查中的大多数转移到带有模拟对象的PHPUnit测试中,以验证我们的服务工作,但我们的QA团队仍然希望验证实际呈现的结果是否匹配 如果您有任何建议,我们将不胜感激。指出“如何等待Ajax调用完成”的问题 在这个场景中有两种不同的方法,下面将列出它们的优缺点 方法:1 添加一段带有全局变量的代码,该变量指示有多少Ajax调用挂起,因此也可以在selenium文本中访问相同的变量如何使用Selenium测试网页,selenium,phpunit,Selenium,Phpunit,当我使用PHPUnit来隔离和测试应用程序代码时,我们的QA团队一直在使用Selenium测试UI。我听说考试要花10个多小时才能完成,我认为这太长了。然后,我的问题是如何在处理页面时等待AJAX调用 例如,我们有一个包含大量输入的页面,它将调用AJAX调用与我们的服务进行对话,以显示数据。我们有多个输入,然后在后续选择框更改时对其进行过滤 分区都已加载,分区(属于分区)和存储区(属于分区)也是如此 现在,选择框都是最初加载的,因此最终用户可以选择其中的任何一个。但是,一旦选择框具有 选择完成后
$.activeAjaxRequestCount = 0;
$().ajaxSend(function() {
$.activeAjaxRequestCount++;
// register lazily to make sure it's the last handler of
// ajaxError event and get executed after all production handlers
if(!$._ajaxErrorHandlerAdded) {
$().ajaxError(function() {
$.activeAjaxRequestCount--;
});
$._ajaxErrorHandlerAdded = true;
}
})
.ajaxSuccess(function() {
$.activeAjaxRequestCount--;
});
/* C# code in selenium tests */
// run this js code somehow before selenium test
// to turn off animation of jQuery
Selenium.executeScript("$.fx.off = true");
private void WaitComplete(Action action, int timeout)
{
// do default selenium action
action();
// wait for active ajax request count becomes zero,
// none ajax selenium action will return immediately
selenium.WaitForCondition("selenium.browserbot.getCurrentWindow();
window.jQuery.activeAjaxRequestCount===0;",
timeout.ToString());
}
优点:完全是客户端
缺点:很难确定从一个页面触发的多个ajax调用中完成了哪个ajax调用。因此,在这种方法中……您需要等待所有ajax调用完成,尽管数据可能已经加载到页面上
参考:
方法2:
在这种方法中,我们等待ajax调用成功并显示数据。以Selenium方式呈现:我们等待测试的执行,直到页面上出现特定的HTML实体/数据
var Waiting = new WebDriverWait(X, TimeSpan.FromSeconds(5));
var Data_Loaded = Waiting.Until(driver => driver.FindElement(By.Id("Divisionxyz")));
优点:在单个页面上触发多个ajax调用以获取数据时非常简单
缺点:加载动态元素/对象时,这将不起作用
希望这能帮上忙……所有最好的朋友:)谢谢。我们有元素存在的问题,但是想知道它什么时候加载了数据(想想选择框,它是存在的,当前面的选择框改变时,这个选择框会改变)。我想在重新加载该框时测试它是否具有基于先前填充的元素的正确内容。由于元素总是在那里,所以.FindElement不起作用,因为它在AJAX调用完成之前就在那里。当然,buddy…很乐意帮助您…您可以发布一些元素的HTML代码,这些代码已经存在,并且在AJAX调用完成后加载数据。我必须为您准备一些示例代码。我要找我们的质量保证部。我们的页面是生成的,而且相当大。让我从中创建一个示例,我可以更新原始问题。谢谢你的帮助。
var Waiting = new WebDriverWait(X, TimeSpan.FromSeconds(5));
var Data_Loaded = Waiting.Until(driver => driver.FindElement(By.Id("Divisionxyz")));