`
sigmaIsland
  • 浏览: 9617 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

AJAX自动化测试

阅读更多

AJAX自动化测试

(使用集成seleniumSigmationTF自动化测试框架对EXTJS

进行自动化测试)

 

 

 

 

1 技术背景

 

本文主要介绍如何利用SigmationTFSelenium插件进行基于ExtJS及类似框架的Web GUI自动化测试

 

l      SigmationTF作为成都杰华科技的旗舰产品,已经为不同领域的许多客户实现了多类产品测试自动化。这其中包括防火墙、路由器、交换机、无线Mesh以及网管产品生产设备厂商。SigmationTF作为一个通用平台,集成了大量开源软件辅助用户完成自动化测试。

l      Selenium 支持录制回放,多浏览器的Web自动化测试工具

l      Ext JS是一种用JavaScript编写的功能强大的Ajax框架,可用于开发绚丽多彩的富客户端Ajax应用。

 

阅读本文的读者最好需要了解以下技术或编程脚本语言:selenium + perl

SigmationTF: http://www.sigma-rt.com

Selenium: http://seleniumhq.org/

2 问题与挑战

随着网络技术的发展,良好的用户体验及丰富的客户端功能已经成为Web程序所共同追求的目标,并扮演非常重要的一环。基于AJAX应用的盛行,Prototype,ExtJS, ZK, Yui等越来越多的第三方开源JavaScript Library开始涌现,并为大众所广泛利用。虽然这极大地增加了我们对Web应用的扩展可能性,但同时也为我们的WebGUI自动化提出了新的难题。

2.1 动态ID

 

通过SeleniumExtJS类似框架页面进行测试的最大障碍是这些框架大量利用了大量动态的diviframe,并且包含了大量非标准的HTML元素。事实上,ExtJS通过大量冗余的元素来使页面看起来更美观,提升用户体验,但却极大的干扰了Selenium IDE录制生成脚本的可维护性。如下所示利用Selenium IDE录制的Google Mail的脚本,如果用户想要通过Selenium IDE简单录制生成的脚本对象进行回归和自动化,确实是相当困难。

当用户通过Selenium IDE来录制在浏览器内的操作并自动生成相应的命令和定位器时,Selenium将主要基于HMTL元素的IDs。但事实上,几乎绝大部分的可点击的元素、按钮,它们的ID都是由ExtJS统一自动生成的。因而我们可以通过分析工具(Firebug)看到很多类似于”ext-gen-123”的元素ID,同时细心的用户还会发现,在不同的浏览器内,页面元素的ID是不一样的。页面稍微改动,ID同样会发生变化。甚至于ID会由于我们点击页面元素的顺序差异而发生变化,但此时,是没有人进行过任何代码修改的。由此可想而知,通过Selenium IDE录制生成脚本的可靠性。

2.2 事件触发

通过selenium IDE 录制到的点击操作为click, 但是到实际用selenium  RC 来执行$sel->click($locator)的命令,却发现click后事件并未触发。

2.3 等待页面加载

Selenium提供了一系列用于执行用户操作并等待页面装载和响应的*AndWait函数。但是,由于AJAX使用部分页面装载技术以增加用户体验,因而,这些命令将不再适用于非同步装载的AJAX页面。

2.4 选择执行效率高的locator

Selenium支持多个浏览器,也提供多种locator的格式来实现页面元素的定位。但是选择一个执行效率高的locator类型是我们要讨论的。

3 解决方案

3.1 定位动态ID

3.1.1选择页面分析工具

 

既然不能完全依靠录制,我们又如何了解和分析页面呢?这里我们推荐大家使用基于Internet Explorer IEDevtoolbar或者基于Firefox的插件Firebug

 

  • IEDevToolbar

http://www.microsoft.com/downloadS/details.aspx?familyid=E59C3964-672D-4511-BB3E-2D5E1DB91038&displaylang=en

 

 

  • Firebug

https://addons.mozilla.org/en-US/firefox/addon/1843

 

 

从个人 角度来说,Firebug更易于使用。在任何情况下,用户在Firefox浏览器中只需要点击右键并选择”Inspect Element”,则会自动呼出Firebug窗口,并显示页面上当前鼠标位置所在元素的相关属性。本文基于页面元素分析的抓图都将使用Firebug

 

 

 

 

 

HTML DOM HTML 文档呈现为带有元素、属性和文本的树结构(节点树)。通过DOM,我们还可以充分利用JavaScript的灵活性。

 

如图所示,这个页面中面板套面板,且数据都是动态生成的。像这里点击”VLANS”之后,其对应数据区的IFRAME才开始装载。我们如果要获取该数据区的内容,按照Selemium的约定,我们必须先切换到该IFRAMEID是动态生成的,我们不能使用,通过class,这里有多个IFRAME。那应该怎么办呢?

我们通过Firebug分析发现,每个抬头(Routes, Subnets, VLANs)都对应有各自的IFRAME。首先我们可以通过:

 

$locator=”css=.x-panel-header-text:contains(‘VLANs’)”

 

找到VLANS这个元素对象,再按照dom树回溯父节点两次后取第一项,我们就可以得到这个IFRAME.

假设eVLANS元素对象,那么IFRAME应该是

 

e.parentNode.parentNode.getElementsByTagName(‘iframe’)[0];

 

但这完全是两个定位方法,我们如何组合他们呢?

这里我们需要擎出Selenium内部的API 了:

 

sub extjs_select_header_frame {

       my ($browser, $header) = @_;

 

my $locator = “dom=var header=this.browserbot.findElement(‘css=.x-panel-header-text:contains(\\'$header\\')');” .

“header.parentNode.parentNode.getElementsByTagName(‘iframe’)[0]”;

       if (!$browser->is_element_present($locator)) {

              die(“Can not find iframe for tab header `$header’”);

 }

$browser->select_frame($locator);

print “Now switch to frame of tab header `$header’, and location is “ .

                     $browser->get_location() . “\n”;

}

 

 

这里我们通过selenium对象的browserbot属性中的findElement方法首先通过CSS 定位器找到抬头对象,然后再通过回溯DOM树得到IFRAME

充分利用DOMSelenium Core本身的特性,我们不仅可以高效率的精确定位页面元素,同时也可以保证脚本的可读性和易维护性

 

上一小节我们见识了DOMJavaScript结合的威力。实际上,灵活运用JavaScript,它的能力远不止此。本节将以获取结构化的ExtJS 网格(Grid)控制数据为例,向用户展示更多活用JavaScript的例子。

 

 

我们先抛开分页信息,只管取当前页面的数据。这里是一个示意的页面图片。

通过Firebug,我们可以首先找到class(CSS locator)x-grid-paneldiv节点,它会有个类似于“ext-comp-1008”的ID,这个IDExtJS的组件ID,它不同于”ext-gen12”类似ID,是不会改变的。同时这个ID也可以由Web developer定义。借助于Firebug,我们可以看到,网格中的数据都在这个里面了。

再分析节点下的数据:

 

 

 

网格中的每一记录,都存放在一个class为“x-grid3-row-table”的表格中

看看每一列的情况:

 

 

 

有了这些,可以先写个函数取网格中的每行数据了:

sub extjs_get_grid_row {

    my ($browser, $grid, $row)  = @_;

 

    my $script = "var doc = this.browserbot.getCurrentWindow().document;\n" .

        "var grid = doc.getElementById('$grid');\n" .

        "var table = grid.getElementsByTagName('table');\n" .

        "var result = '';\n" .

        "var row = 0;\n" .

        "for (var i = 0; i < table.length; i++) {\n" .

        "   if (table[i].className == 'x-grid3-row-table') {\n".

        "       row++;\n" .

        "       if (row == $row) {\n" .

        "           var cols_len = table[i].rows[0].cells.length;\n" .

        "           for (var j = 0; j < cols_len; j++) {\n" .

        "               var cell = table[i].rows[0].cells[j];\n" .

        "               if (result.length == 0) {\n" .

        "                   result = getText(cell);\n" .

        "               } else { \n" .

        "                   result += '|' + getText(cell);\n" .  ## 把每行数据通过“|”串行来,当然,如果网格中数据包含有“|”,那就只能换别的了。

        "               }\n" .

        "           }\n" .

        "       }\n" .

        "   }\n" .

        "}\n" .

        "result;\n";  ## get_eval获取的是最后一个表达式的结果。

 

    my $result = $browser->get_eval($script);  ##拿到我们想要的数据了,:)

    my @res = split('\|', $result);

    return @res;

}

 

 

依葫芦画瓢,再加个取当前页面网格行数的:

 

sub extjs_get_grid_row_num {

    my ($browser, $grid)  = @_;

 

    my $script = "var doc = this.browserbot.getCurrentWindow().document;\n" .

        "var grid = doc.getElementById('$grid');\n" .

        "var table = grid.getElementsByTagName('table');\n" .

        "var row = 0;\n" .

        "for (var i = 0; i < table.length; i++) {\n" .

        "   if (table[i].className == 'x-grid3-row-table') {\n".

        "       row++;\n" .

        "   }\n" .

        "}\n" .

        "row;\n";

 

    my $result = $browser->get_eval($script);

    return $result;

}

 

 

有了这两个基础的API,对用户来说,获取当前页面指定网格的所有数据,并以二维数组的形式返回结果,自然不是什么难事。

 

 

看过了上面的介绍,让我们来看看网格的分页信息。顺便再次回顾一次CSS定位器。

 

 

 

 

 

用我们提到的CSS,把页面的分页信息拿下:

sub extjs_get_paging_info {

       my ($browser) = @_;

      

       my $locator = “css=.x-paging-info”;

       my $paging = $browser->get_text($locator); # 取到 “Displaying 1 – 11 of 22”

 

       my @matches = $paging =~ /([0-9]+) - ([0-9]+) of ([0-9]+)/; #处理一下,只拿我们所关心的起始记录和总记录数

return @matches;

}

 

当然了,翻页的按钮肯定得找到:

 

 

 

sub extjs_goto_next_page {

       my ($browser) = @_;

 

       my @pages = extjs_get_paging_info($browser);

 

      

       # 打印当前页数

       print “Current page: “ . $browser->get_text("css=.x-tbar-page-number") . “\n”;

       # 点击“下一页”按钮

       if (@pages[1] < @pages[2]) {

$browser->click("css=.x-tbar-page-next");

       } else {

              print “Reach to ending page\n”;

}

}

 

 

 

 

 

 

3.2       等待页面加载

3.2.1   wait_for_element_present替代wait_for_page_to_load

 

 

 因为Wait_for_page_to_load 函数失效, 建议用户多使用wait_for_element_present。在Selenium RCPerl 驱动中,未提供有waitForElementNotPresent 的接口,但是我们可以通过执行Javascript来调用或者自行进行扩展。

示例:

 

$browser->wait_for_element_present($locator);

$browser->click($locator);

 

 

 

 

 

3.2.2   自己封装等待页面加载函数

 

EXT-JS为局部页面加载,需要遍历整张HTML的表格中的frame, iframe readaystate的状态,可以写一个递归函数来实现,限于篇幅就不具体说明。

 

3.3 解决事件触发问题

 

一些基于ExtJS页面的HTML元素不能为”click”命令所触发。比如ExtJS中面板的Tab,但是我们可以模拟鼠标点击操作。

 

$browser->mouse_down_at(“css=.x-tab-strip-text:contains('Options')”, “0,0”);

 

如果遇到click触发事件失败,请结合使用mouse_down, mouse_up, mouse_down_at此类函数使用

3.4选择执行效率高的locator

 

根据以往经验,在不同浏览器上,xpath, CSS的执行效率都低于dom, javascripts. 所以如果要支持多个版本的浏览器,建议选择DOM javascsripts.

 

 

0
0
分享到:
评论

相关推荐

    Selenium2 Python 自动化测试实战(扫描版)-2019PDF高清带目录(完整版).zip

    《Selenium2 Python 自动化测试实战》是一本专注于使用Python和Selenium2进行Web自动化测试的专业书籍。这本书详尽地介绍了如何利用Selenium2这个强大的工具,配合Python语言,来构建高效、可靠的自动化测试框架,以...

    Web自动化测试中的接口测试.pdf

    Web自动化测试中的接口测试是一种重要的测试手段,主要是针对Web应用中后端服务的接口进行测试,以确保各个服务模块之间能正确交互。本文主要针对Web自动化测试中的接口测试方法、工具和技术等方面的知识进行深入...

    web自动化测试

    在IT行业中,自动化测试是一种广泛采用的技术,特别是对于Web应用程序来说。它可以帮助开发人员和测试工程师提高测试效率,减少手动测试的时间和出错率。在这个名为"web自动化测试"的例子中,我们关注的是如何利用...

    Silverlight_aspx_ajax_mvc的UI自动化测试

    ### Silverlight_aspx_ajax_mvc的UI自动化测试详解 #### 引言 随着软件开发的不断进化,自动化测试已经成为确保软件质量的关键环节。对于复杂的Web应用程序,如那些基于Silverlight、ASP.NET AJAX、MVC框架构建的...

    自己动手写Web自动化测试框架.doc

    【自己动手写Web自动化测试框架】的文档是一个指导如何构建基于C#的Web自动化测试工具的教程。这个框架旨在帮助测试人员高效编写自动化测试代码,并在出现错误时快速定位问题。文档提到了两个主要的非托管类库:...

    构建简单健壮的Web自动化测试的模式(完整版)

    通过合理运用Selenium API,处理好Ajax和动画效果,以及避免使用低效的同步等待方法,可以大大提高Web自动化测试的效率和质量。通过本文的介绍,希望读者能够掌握构建健壮Web自动化测试模式的关键技术,并在实际工作...

    Selenium自动化测试:基于Python语言.rar

    "Selenium自动化测试:基于Python语言.pdf"可能是本书的电子版,详细讲解了Selenium的基础知识、安装配置、元素定位方法(如CSS选择器、XPath、ID、Name等)、各种操作(如点击、输入、截屏)以及高级用法,如模拟...

    Selenium自动化测试培训

    Selenium自动化测试培训旨在提供全面的知识和技能,帮助学员掌握Selenium工具的使用,自动化测试脚本的设计,以及自动化测试框架的构建。 ### 自动化测试基础 在开始学习Selenium之前,理解自动化测试的基本原理至...

    web自动化测试学习以及Javascript学习(四)

    【标题】"Web自动化测试学习以及JavaScript学习(四)"主要涵盖了两个核心主题:Web自动化测试和JavaScript编程。本文将深入探讨这两个领域的关键知识点,并结合实际应用进行详细讲解。 在Web自动化测试方面,通常...

    构建简单的web自动化测试模型

    ### 构建简单的web自动化测试模型 #### 一、引言 随着软件开发技术的不断发展,Web应用变得越来越复杂,为了确保这些应用的质量,自动化测试成为了一种必不可少的方法。本篇文章将详细介绍如何构建一个简单而健壮的...

    用selenium进行自动化测试

    【Selenium 自动化测试详解】 Selenium 是一个强大的开源自动化测试工具,专门用于Web应用程序的验收测试。它由ThoughtWorks公司开发,旨在提供一种直接在浏览器中运行的测试方式,模拟真实用户的行为,确保应用的...

    自动化测试框架RobotFramework+Selenium2

    自动化测试框架RobotFramework+Selenium2 自动化测试框架RobotFramework+Selenium2是结合RobotFramework框架和Selenium2Library实现自动化测试的解决方案。下面是该框架的详细介绍: 简介 Robot Framework是一个...

    《Python编程基础与自动化测试》读书笔记模板.pptx

    自动化测试的场景和特点包括自动化测试的优点、自动化测试的类型、自动化测试的流程等内容。 单元测试 单元测试是一种软件测试方法,通过对软件的每个单元进行测试,确保软件的每个单元都能正确工作。单元测试的...

    接口自动化测试

    接口自动化测试是软件开发过程中的重要环节,尤其在现代Web应用程序中,接口测试扮演着验证系统组件间通信的关键角色。本文将深入探讨接口自动化测试,包括其重要性、使用工具,特别是结合Chrome插件进行测试的方法...

    网站自动化测试工具 Web测试工具介绍.pptx

    【网站自动化测试工具 Web测试工具介绍】 在软件测试领域,特别是针对Web应用的测试,自动化测试工具扮演着至关重要的角色,能够显著提高测试效率并减少人为错误。QTester是一款广泛使用的自动化测试工具,专为网站...

    selenium自动化验收测试

    - **示例应用**:文章中提到了一个使用Ruby on Rails和Ajax的实际项目作为案例,通过这个案例可以了解如何具体应用Selenium进行自动化测试。例如,在使用Ajax的应用程序中,Selenium可以帮助测试异步加载的内容是否...

    Canoe-Capl测试脚本源码开发:通信电压读取与多种功能自动化测试案例解析,Canoe-Capl测试脚本源码平台开发:涵盖Can通信电压读取、设备Busoff等自动化测试案例及报告生成,Canoe

    Canoe-Capl测试脚本源码开发:通信电压读取与多种功能自动化测试案例解析,Canoe-Capl测试脚本源码平台开发:涵盖Can通信电压读取、设备Busoff等自动化测试案例及报告生成,Canoe-Capl测试脚本源码平台开发 ...

    自动化测试的相关工具详解.pdf

    ### 自动化测试工具详解 #### 一、引言 随着软件开发的速度加快和技术更新迭代的频率提升,软件测试已成为确保软件质量不可或缺的一环。自动化测试作为软件测试的一个重要分支,能够有效提高测试效率和准确性,...

    Java柠檬班Java全栈自动化

    Java全栈自动化课程将教授学员如何利用自动化测试工具,如JUnit、Selenium和TestNG等,进行单元测试、集成测试、系统测试等。学员将学习自动化测试的设计原则,测试用例的编写,测试流程的管理,以及持续集成和持续...

    基于RationalFunctionalTester(RFT)开发Web应用自动化测试框架.pdf

    在构建自动化测试框架时,本文以一个名为DM(Decision Management)的Web产品为例,该产品是一个基于GWT(Google Web Toolkit)的Ajax前端应用。测试框架的主要目标是对view层的用户交互、服务调用后的数据验证以及...

Global site tag (gtag.js) - Google Analytics