如图所示,这个页面中面板套面板,且数据都是动态生成的。像这里点击”VLANS”之后,其对应数据区的IFRAME才开始装载。我们如果要获取该数据区的内容,按照Selemium的约定,我们必须先切换到该IFRAME。ID是动态生成的,我们不能使用,通过class,这里有多个IFRAME。那应该怎么办呢?
我们通过Firebug分析发现,每个抬头(Routes, Subnets, VLANs)都对应有各自的IFRAME。首先我们可以通过:
$locator=”css=.x-panel-header-text:contains(‘VLANs’)”
找到VLANS这个元素对象,再按照dom树回溯父节点两次后取第一项,我们就可以得到这个IFRAME.
假设e为VLANS元素对象,那么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。
充分利用DOM和Selenium Core本身的特性,我们不仅可以高效率的精确定位页面元素,同时也可以保证脚本的可读性和易维护性
上一小节我们见识了DOM与JavaScript结合的威力。实际上,灵活运用JavaScript,它的能力远不止此。本节将以获取结构化的ExtJS 网格(Grid)控制数据为例,向用户展示更多活用JavaScript的例子。
我们先抛开分页信息,只管取当前页面的数据。这里是一个示意的页面图片。

通过Firebug,我们可以首先找到class(CSS locator)为x-grid-panel的div节点,它会有个类似于“ext-comp-1008”的ID,这个ID是ExtJS的组件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定位器。
相关推荐
《Selenium2 Python 自动化测试实战》是一本专注于使用Python和Selenium2进行Web自动化测试的专业书籍。这本书详尽地介绍了如何利用Selenium2这个强大的工具,配合Python语言,来构建高效、可靠的自动化测试框架,以...
Web自动化测试中的接口测试是一种重要的测试手段,主要是针对Web应用中后端服务的接口进行测试,以确保各个服务模块之间能正确交互。本文主要针对Web自动化测试中的接口测试方法、工具和技术等方面的知识进行深入...
在IT行业中,自动化测试是一种广泛采用的技术,特别是对于Web应用程序来说。它可以帮助开发人员和测试工程师提高测试效率,减少手动测试的时间和出错率。在这个名为"web自动化测试"的例子中,我们关注的是如何利用...
### Silverlight_aspx_ajax_mvc的UI自动化测试详解 #### 引言 随着软件开发的不断进化,自动化测试已经成为确保软件质量的关键环节。对于复杂的Web应用程序,如那些基于Silverlight、ASP.NET AJAX、MVC框架构建的...
【自己动手写Web自动化测试框架】的文档是一个指导如何构建基于C#的Web自动化测试工具的教程。这个框架旨在帮助测试人员高效编写自动化测试代码,并在出现错误时快速定位问题。文档提到了两个主要的非托管类库:...
通过合理运用Selenium API,处理好Ajax和动画效果,以及避免使用低效的同步等待方法,可以大大提高Web自动化测试的效率和质量。通过本文的介绍,希望读者能够掌握构建健壮Web自动化测试模式的关键技术,并在实际工作...
"Selenium自动化测试:基于Python语言.pdf"可能是本书的电子版,详细讲解了Selenium的基础知识、安装配置、元素定位方法(如CSS选择器、XPath、ID、Name等)、各种操作(如点击、输入、截屏)以及高级用法,如模拟...
Selenium自动化测试培训旨在提供全面的知识和技能,帮助学员掌握Selenium工具的使用,自动化测试脚本的设计,以及自动化测试框架的构建。 ### 自动化测试基础 在开始学习Selenium之前,理解自动化测试的基本原理至...
【标题】"Web自动化测试学习以及JavaScript学习(四)"主要涵盖了两个核心主题:Web自动化测试和JavaScript编程。本文将深入探讨这两个领域的关键知识点,并结合实际应用进行详细讲解。 在Web自动化测试方面,通常...
### 构建简单的web自动化测试模型 #### 一、引言 随着软件开发技术的不断发展,Web应用变得越来越复杂,为了确保这些应用的质量,自动化测试成为了一种必不可少的方法。本篇文章将详细介绍如何构建一个简单而健壮的...
【Selenium 自动化测试详解】 Selenium 是一个强大的开源自动化测试工具,专门用于Web应用程序的验收测试。它由ThoughtWorks公司开发,旨在提供一种直接在浏览器中运行的测试方式,模拟真实用户的行为,确保应用的...
自动化测试框架RobotFramework+Selenium2 自动化测试框架RobotFramework+Selenium2是结合RobotFramework框架和Selenium2Library实现自动化测试的解决方案。下面是该框架的详细介绍: 简介 Robot Framework是一个...
自动化测试的场景和特点包括自动化测试的优点、自动化测试的类型、自动化测试的流程等内容。 单元测试 单元测试是一种软件测试方法,通过对软件的每个单元进行测试,确保软件的每个单元都能正确工作。单元测试的...
接口自动化测试是软件开发过程中的重要环节,尤其在现代Web应用程序中,接口测试扮演着验证系统组件间通信的关键角色。本文将深入探讨接口自动化测试,包括其重要性、使用工具,特别是结合Chrome插件进行测试的方法...
【网站自动化测试工具 Web测试工具介绍】 在软件测试领域,特别是针对Web应用的测试,自动化测试工具扮演着至关重要的角色,能够显著提高测试效率并减少人为错误。QTester是一款广泛使用的自动化测试工具,专为网站...
- **示例应用**:文章中提到了一个使用Ruby on Rails和Ajax的实际项目作为案例,通过这个案例可以了解如何具体应用Selenium进行自动化测试。例如,在使用Ajax的应用程序中,Selenium可以帮助测试异步加载的内容是否...
Canoe-Capl测试脚本源码开发:通信电压读取与多种功能自动化测试案例解析,Canoe-Capl测试脚本源码平台开发:涵盖Can通信电压读取、设备Busoff等自动化测试案例及报告生成,Canoe-Capl测试脚本源码平台开发 ...
### 自动化测试工具详解 #### 一、引言 随着软件开发的速度加快和技术更新迭代的频率提升,软件测试已成为确保软件质量不可或缺的一环。自动化测试作为软件测试的一个重要分支,能够有效提高测试效率和准确性,...
Java全栈自动化课程将教授学员如何利用自动化测试工具,如JUnit、Selenium和TestNG等,进行单元测试、集成测试、系统测试等。学员将学习自动化测试的设计原则,测试用例的编写,测试流程的管理,以及持续集成和持续...
在构建自动化测试框架时,本文以一个名为DM(Decision Management)的Web产品为例,该产品是一个基于GWT(Google Web Toolkit)的Ajax前端应用。测试框架的主要目标是对view层的用户交互、服务调用后的数据验证以及...