Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}

之前已经讲过了 Selenium 操作 Select 实现的下拉列表:Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select,但是在实际的日常网页开发中,实现下拉列表的方法、样式、特效有 N 多种,但是无论实现的方法有多少不同,其都会遵循一定的规律,在此我就不再赘述了(有兴趣的小主,可以找有经验的前段请教一下)。同时,此类实现的下拉列表在使用 Selenium 进行定位时,往往不尽如人意,定位比较繁琐。

此文仅以 淘宝网账户注册时选择手机号码所属区域的下拉列表操作为原型,进行 WebUI 自动化中 Selenium 通过 JavascriptExecutor 执行 JavaScript 进行下拉列表操作的实战源码讲解演示,敬请各位小主参阅,希望能对您在日常的 WebUI 自动化脚本编写有一定的启发和帮助。若有不足或错误之处,敬请大神指正,不胜感激!

淘宝网账户注册网页链接:http://reg.taobao.com/member/reg/fill_mobile.htm,页面如下所示:

通过 Chrome 打开网页链接后,点击手机号码所在地下拉列表,随便选一个地区,然后按 F12 查看源码,可以非常容易的定位到下拉列表显示的元素,如下图所示:

同时也可比较容易的找到下拉列表可选项存储的位置(不知道这个 ID 会不会变),如下图所示:

此时获取可选列表数组的 js 脚本为:document.getElementById(‘ks-component3714‘).children[0],若想选择索引为 20 的手机号码地区,则脚本为:document.getElementById(‘ks-component3729‘).children[0].children[20].click(),选择不同地区仅需修改 children[20] 中的索引值即可(注意索引不能超出边界,否则会报错)。OK,编写脚本并执行。

此时悲剧了,用例执行失败,脚本报出如下错误信息:


org.openqa.selenium.WebDriverException: unknown error: Cannot read property ‘children‘ of null

(Session info: chrome=41.0.2272.118)
  (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 8 milliseconds
Build info: version: ‘2.44.0‘, revision: ‘76d78cf‘, time: ‘2014-10-23 20:02:37‘

由提示信息可知,js 脚本获取元素后元素无 children 属性,查看源码(OMG,好大一个坑啊!此时居然没有 id=‘ks-component3714‘ 的元素,即没有下拉选项列表)可知,初始打开页面,手机归属地列表不显示,需要点击一下手机号码所在地区的下拉列表框触发相应的事件,才会出现下拉列表项。通过页面源码及实际操作可知,操作红框中的任意区域,均可触发相应事件,因而编写 js 脚本触发事件(弹出手机号码归属地下拉列表),js 脚本为:document.getElementsByClassName(‘code‘)[0].click(),在自动化脚本选择手机号码归属地的前面添加上述代码,运行 WebUI 自动化脚本,结果如下(OY,成功了):

 
PASSED: testDroplist02

===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

后续又运行了几次,突然间发现又自动化脚本又报错了,信息如下:

FAILED: testDroplist02
org.openqa.selenium.WebDriverException: unknown error: Cannot read property ‘children‘ of null
  (Session info: chrome=41.0.2272.118)
  (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 10 milliseconds
Build info: version: ‘2.44.0‘, revision: ‘76d78cf‘, time: ‘2014-10-23 20:02:37‘

郁闷,为何之前好好的,奈何现在又崩掉了呢?首先可以肯定的是脚本逻辑是没有问题的,那么问题出在哪儿呢?页面源码。查之,列表项的父级 ID 居然变了,将注册页面的 URL 换不同的浏览器多刷新几次,发现父级元素 ID: ks-component3714 后四位有时会变化,不固定(不得不敬佩一下淘宝的攻城狮们,代码写的不错啊,55555)

ZTMDDT,怎么办呢?必须兼容此种问题,怎么兼容呢,DTA!!!

解决思路:通过 JavaScript 脚本的查找 父级、子级、兄弟 元素定位手机号码归属地可选项列表。

追根溯源走起,查源代码,通过分析此部分的源码,发现 class=‘code‘ 仅为手机号码归属地所用,当第一次打开页面时,执行 js 脚本 document.getElementsByClassName(‘code‘) 的结果为当前已选择的手机号码归属地的 code 码(此码不可用于定位手机号码归属地可选项列表,因其为显示所用);当触发了列表事件,显示出可选项列表项时,再次执行 js 脚本,获取到了所有的手机号码归属地的编码列表,如下图所示(第一个为当前已选显示的手机号码归属地):

因不确定手机号码归属地地区编码数组的长度,因而取上图中的第二个(也就是列表项的第一个)为起点,此时 js 脚本为 : document.getElementsByClassName(‘code‘)[1],然后通过获取其父级,进而获取全部的手机号码归属地的子集,最终的手机号码归属地子集脚本为:document.getElementsByClassName(‘code‘)[1].parentNode.parentNode,最终选择手机号码归属地的 js 脚本为:document.getElementsByClassName(‘code‘)[1].parentNode.parentNode.children[18].click()。再次优化 WebUI 自动化脚本,将上述脚本替换原来的脚本,执行自动化脚本,查看自动化脚本执行结果,perfect。

最后奉上此文的 WebUI 自动化脚本源代码,敬请各位小主参阅。若有不足或者错误之处,敬请大神指正,不胜感激!

 1 package main.aaron.demo.droplist;
 2
 3 import main.aaron.sele.core.TestCase;
 4
 5 import org.testng.annotations.Test;
 6
 7 /**
 8  * Selenium 操作下拉列表实例-div+{js|jquery}
 9  *
10  * @author Aaron.ffp
11  * @version V1.0.0: autoSeleniumDemo main.aaron.demo.droplist Droplist02.java, 2015-6-17 00:39:17 Exp $
12  */
13 public class Droplist02 extends TestCase{
14     // 获取淘宝网账户注册的 URL 路径
15     private final String baseUrl = "http://reg.taobao.com/member/reg/fill_mobile.htm";
16
17     // 手机号码归属地下拉列表
18     private String jscript_onclick = "";
19
20     // 手机号码归属地选项列表-未兼容列表项 ID 变化的情况
21     private String jscript_items = "";
22
23     // // 手机号码归属地选项列表-兼容列表项 ID 变化的情况
24     private String jscript_itemsPerfect = "";
25
26     /**
27      * Selenium 操作下拉列表实例-div+{js|jquery} --- 以淘宝网用户注册时选择手机号码归属地为实例
28      *
29      * @author Aaron.ffp
30      * @version V1.0.0: autoSeleniumDemo main.aaron.demo.droplist Droplist02.java testDroplist02, 2015-6-17 00:42:29 Exp $
31      *
32      */
33     @Test
34     public void testDroplist02(){
35         this.jscript_onclick = "document.getElementsByClassName(‘code‘)[0].click()";
36         this.jscript_items = "document.getElementById(‘ks-component3712‘).children[0].children[19].click()";
37         this.jscript_itemsPerfect = "document.getElementsByClassName(‘code‘)[1].parentNode.parentNode.children[18].click()";
38
39         this.webdriver.get(this.baseUrl);
40
41         this.execJavascript(this.jscript_onclick);
42
43 //        this.execJavascript(this.jscript_items);
44
45         this.execJavascript(this.jscript_itemsPerfect);
46     }
47 }

Selenium 操作下拉列表实例-div+{js|jquery} --- 以淘宝网用户注册时选择手机号码归属地为实例

PS:各位小主们,在实际的日常自动化脚本编写过程中,若是有兴趣,可以此为联系,对选择手机号码归属地的 js 进行封装,将其归属地名称或者编码作为参数传入,进而更好地控制脚本,同时也使脚本模块化,更加有利于自动化脚本的编写。

至此,WebUI 自动化功能测试脚本第 012 篇-Selenium 操作下拉列表实例-div+{js|jquery} 顺利完结,希望此文能够给初学 Selenium 的您一份参考。

最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

时间: 2024-10-08 11:43:44

Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}的相关文章

Selenium2学习-003-Selenium2 WebUI自动化实战实例-001-百度搜索

此文主要通过百度搜索功能,进行 Selenium2 的实战实例讲解,文中所附源代码于 2015-01-16 02:01 亲测通过,敬请亲们阅览.希望能对初学 Selenium2 UI 自动化测试编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! 脚本实现功能步骤如下所示: 启动 Chrome 浏览器 打开百度网址:www.baidu.com 输入搜索项:范丰平 博客园 获取搜索结果的第一项,并打开 关闭 Chrome 浏览器(为显示打开效果,已将此项注释) 夜已深了,鬼话少述,直接上源代

Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select

此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,对下拉列表框 Select 的操作. 下拉列表是 Web UI 自动化测试过程中使用率非常高的,通常有两种形式的下拉列表,一种是 Select 的下拉列表,此种操作的时候比较简单,定位到元素后直接操作即可:还有的下拉列表是以多个 div + js + input 的形式实现,input 用于存储选择的项的 value 值:当然也会有其他方式实现的下拉列表. 希望能对初学 Selenium2 WebUI 自动化测试编程的亲

Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary

此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary 报错解决方法. 希望能对初学 Selenium2 WebUI 自动化测试编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! 之前给朋友初步介绍了 S

Selenium2学习-034-WebUI自动化实战实例-032-页面快照截图应用之三 -- 区域截图(专业版)

之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无法满足,那么该如何操作呢? 刷新页面,相当于页面归位操作 判断要截取的区域范围与当前浏览器显示区域大小关系,若截取范围大于显示区域,则重置浏览器窗口大小 模拟鼠标操作滚动屏幕,使需要截取的区域显示到浏览器窗口 重新计算截取起始位置相对于当前显示区域的坐标 调用之前的截图方法截图 下面就以获取易迅网首

Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资源,当然,最重要的还是未能达到自己的预期,是不是很内伤啊.此时,我们就不得不像正常用户操作一样,通过滚动页面至相应的区域,那么该如何滚动呢,此文就此给出答案. 此文实现的页面滚动,是通过 js 操作实现的,敬请各位小主参阅.若有不足之处,敬请大神指正,非常感谢! 直接上码了...... 1 /**

Selenium2学习-004-WebUI自动化实战实例-002-百度登录

此文主要通过 百度登录 功能,进行 Selenium2 的实战实例讲解.文中所附源代码于 2015-01-17 23:33 亲测通过,敬请亲们阅览.同时,您也可参考此文进行其他网站(例如 京东.易迅.天猫等)的登录(一般登录流程基本相同,若需填写验证码,因目前验证码识别不方便,初始学习时可让脚本运行到添加验证码时人工输入.在单位进行此部分的自动化脚本编写时,最好取得开发的支持使用万能验证码,方便脚本编写),进行编写登录自动化测试脚本,若您直接使用此文所附的源代码运行测试,则需要将文中 账户名和密

Selenium2学习-039-WebUI自动化实战实例-文件上传下载

通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a或其他方式结合实现). 非input标签类因其有各式各样的实现方式,需要考虑具体的场景,因而此文对此类文件上传不做讲解,以input标签实现文件上传的方式进行讲解,请知悉! 解决方案有如下三种: 1.定位元素直接通过sendkeys修改input标签的文件链接: 2.通过第三方控件(AutoIt)编

Selenium2学习-016-WebUI自动化实战实例-014-Selenium 窗口选择

在日常的 WebUI 自动化测试脚本编写过程中,经常需要打开新的页面,或者在多个打开的页面之间进行切换,以对页面元素进行相应的操作,以模拟用户的行为,实现 UI 的自动化测试.在过往的时间中,经常有初学 Selenium(webdriver) 的朋友问及如何选择窗口的问题,其实 Selenium 已经给我们提供的了相应的方法去解决这个问题.解决思路如下: 1.通过 webdriver.getWindowHandles() 获取所有已打开窗口的信息 Set<String> 2.遍历上述信息,并切

Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚本识别的难度也越来越高.这对我们自动化脚本编写带了非常的不便,那么如何解决登录时的验证码问题呢?经常有初学自动化脚本编写的小主们问及此问题. 此文主要针对如何解决自动化测试脚本中含登录态的操作问题,即如何降低验证码对自动化脚本编写过程中的解决方法进行分析和解决,并以实例演示(基于易迅网易迅账号登录)