看完点个赞呗,难道想白嫖不成?更多内容请访问微信公众号 :三国测,扫码关注哟!

原文链接:http://www.cnblogs.com/zishi/p/6735116.html

一个阴雨霏霏的午后,我边听音乐边打开VS2010开始写case。就像大多数人一样,我先打开了一个之前成功的案例,然后把大部分的框架复制+粘贴,这样子很快就完成了第一个并且运行成功。可是在写第二个的时候却出了状况,Selenium无论如何都无法找到页面上的一个很基本的超链接页面元素。这简直是不可思议,因为代码结构和之前成功的两个一模一样,我又迅速的比较了一下页面结构,也是一样!我开始怀疑是否有特殊的js导致Selenium无法运行?排查一番后仍然一无所获。

在这种诡异的情况下,我试图用比较直接的方法去抓元素,比如Xpath定位。于是打开IDE工具,录制再把脚本抠出来,但是用Css和Xpath统统仍旧是失败。我又仔细的把之前成功的两个case代码运行了几遍,发现问题了,原来我最初拿来做样板的case就是错误的!但是它的错误藏得很深,它虽然没有抓到那个元素,但是它抓到另外一个类似的元素并且幸运的每次都可以跑出来类似的结果,实际上这个跑出来的效果和正确的效果是一样的,因此如果不看具体代码是永远不可能被发现的!现在局面变得有些困难了,因为所有三条case都是失败的,而且代码都是错的,这意味着需要推翻之前的思路,重新设计解决方案。

无奈之下,我开始用最基础的方法进行定位:先找到第一层元素A,然后在元素A里找第二层B,这样层层进行到第四层后,代码失效无法跟踪了。这时候能够最后定位到的元素叫做:” iframe” .而我需要定位的超链接元素a还在更深层,到底是什么原因导致无法跟踪失败呢?

我开始翻一些资料,首先是从Confluence上找到一篇关于谨慎使用iframe的文章,虽然读起来似乎很有道理,不过并不能解决我的问题。继续搜索,在csdn上找到一篇关于

Selenium定位Frame的文章(传送门),虽然是用ruby写的,不过非常有参考价值,其中提到了从当前识别的frame switch到需要定位到的frame方法,看到这句话,仿佛一道曙光划破夜空,我想起来之前遇到的一个alert弹出窗口问题,最后就是用switch方法解决的,ok,到这里解决问题的思路已经有了,下面来看看怎么具体实现。

首先还是初始化一个IWebDriver:

private IWebDriver _Driver;

然后令人惊喜的发现,在 SwitchTo() 果然支持frame:

IWebDriver Frame(IWebElement frameElement);

接下来就是具体实现了:

//初始化

            private IWebDriver _Driver;

            //等待页面加载

            _Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds());

            //先定位第一层

            IWebElement a = _Driver.FindElement(By.ClassName("home-sidebar"));

            //根据第一层元素定位第二层

            IWebElement b = a.FindElement(By.Id("div-gpt-ad-1338866029601-0"));

            //根据第二层定位了第三层

            IWebElement c = b.FindElement(By.TagName("iframe"));

            //运用SwitchTo定位到具体的frame

            _Driver.SwitchTo().Frame(c);

            //从drame里定位最终的元素

            _Driver.FindElement(By.Id("aw0")).Click();

代码写到这里,基本上已经完成了我们用例的功能,接下来需要去验证代码是否成功了,非常凑巧的是,由于代码最后的动作是点击超链接,弹出新的网页,因此又用到一次SwitchTo()的功能,而且这次是SwitchTo().Window,需要去抓一个WindowHandle,好吧,可以当做练手了:

string mainWindowHandle = _Driver.CurrentWindowHandle;

            foreach (string winHandle in _Driver.WindowHandles)

            {

                _Driver.SwitchTo().Window(winHandle);

                if (winHandle != mainWindowHandle)

                    break;

            }

这样最终代码就完成了,包括定位和点击页面元素,最后验证是否跳转到新页面(这里也可以分开写,不过为了大家看的方便,这里就堆在一起了 J ):

public void Img_Click()

        {

            //初始化

            private IWebDriver _Driver;

            //等待页面加载

            _Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds());

            //先定位第一层

            IWebElement a = _Driver.FindElement(By.ClassName("home-sidebar"));

            //根据第一层元素定位第二层

            IWebElement b = a.FindElement(By.Id("div-gpt-ad-1338866029601-0"));

            //根据第二层定位了第三层

            IWebElement c = b.FindElement(By.TagName("iframe"));

            //运用SwitchTo定位到具体的frame

            _Driver.SwitchTo().Frame(c);

            //从drame里定位最终的元素

            _Driver.FindElement(By.Id("aw0")).Click();

             //仍旧是等待页面加载

            _Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds());

            //定位当前的handle

            string mainWindowHandle = _Driver.CurrentWindowHandle;

            //如果handle不同就跳出

            foreach (string winHandle in _Driver.WindowHandles)

            {

                _Driver.SwitchTo().Window(winHandle);

                if (winHandle != mainWindowHandle)

                    break;

            }

            //结束

        }

最后惯例是总结:

首先是对问题的定位,如果没有唯一id或者无法用xpath等方法抓取的时候,就要去分析一下,是不是有什么特殊的难点?然后是寻找方法,这个可以问同事或者自己查资料,总之不能一直钻牛角尖,各种方向都要探索。

另外一点需要警惕的是对老case的依赖,以为以前的能跑通的就是好的,其实不然。因为时间紧、项目急等各种原因,以前的代码也存在了各种问题漏洞,稍不注意就会吃亏,由此也提醒一下,代码上传后一定要做好Code Review工作,给我们的test case再上一道保险。

 作者原创技术文章,转载请注明出处

自动化测试系列:Selenium UI自动化解决iframe定位问题的更多相关文章

  1. Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  2. selenium UI自动化解决验证码的五种方法

    TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...

  3. RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)

    好久没有继续分享关于自动化测试相关的东西了,自动化在现今的测试领域已经越来越重要了,大部分公司在测试岗位招聘中都需要会相关的自动化测试知识.而 RobotFramework自动化测试框架 是自动化测试 ...

  4. RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)

    本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramewor ...

  5. RobotFramework自动化测试框架-Selenium Web自动化(-)-Open Browser和Close Browser

    Selenium出来已经有很多年了,从最初的Selenium1到后来的Selenium2,也变得越来越成熟,而且也已经被很多公司广泛使用.Selenium发展的过程中,分了很多模块,这里我们主要介绍W ...

  6. 【自动化测试】关于UI自动化的疑问(记录ing)

    1. 数据变动问题导致业务需要增加新的逻辑,这是增加case的健壮性还是浪费时间? 2. 如何做好PO? 不断数据抽离不断优化方法? 3. 如何提高调试代码的效率? /web可以 4. 主管不理解自动 ...

  7. java+selenium UI自动化001

    selenium是一个用于Web应用程序测试的工具,可以用来模拟用户在浏览器上的操作. 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl ...

  8. selenium+python自动化之iframe

    我们以163邮箱登录界面为例,简单讲解下如何定位iframe中元素 一开始直接定位界面上元素,我们会发现无法定位到,为什么呢,我们可以通过查看页面元素发现页面中嵌入的有iframe,需要先定位到ifr ...

  9. python+selenium UI自动化不同浏览器之间的切换

    class register(): ROBOT_LIBRARY_SCOPE = 'GLOBAL' def __init__(self): pass # m默认打开chrome def open_bro ...

随机推荐

  1. Java包装

    public class Test2 { public static void main(String[] args) { /*String str = "..............&qu ...

  2. Beta冲刺阶段4.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 活动详情界面的美化 首页活动详情 ...

  3. JTable的模型

    2018-11-04 23:15:21开始写 模型类 import javax.swing.table.DefaultTableModel;//导入包 public class LocalTableM ...

  4. 【Hive学习之四】Hive 案例

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  5. 转:wcf大文件传输解决之道(1)

    首先声明,文章思路源于MSDN中徐长龙老师的课程整理,加上自己的一些心得体会,先总结如下: 在应对与大文件传输的情况下,因为wcf默认采用的是缓存加载对象,也就是说将文件包一次性接受至缓存中,然后生成 ...

  6. 5、CentOS 6.5系统安装配置Nginx-1.2.7+PHP-5.3.22环境

    一,操作系统 以最小服务器形式安装系统,并添加开发工具库,便于后期编译使用. 此处基本都是下一步,下一步,不再废话. 安装完成,进入系统,调通网络,关闭防火墙或打开相应的WEB端口. 以下安装操作默认 ...

  7. 【js】手机浏览器端唤起app,没有app就去下载app 的方法

    这种功能的作用: 1.一般公司有自己的app,而app是需要不断有新用户涌入才能持续运营,达到不错的收入.就需要使用这种方式进行引入新的用户. 2.一些内容在网页端体验不好,或者一些功能需要app内才 ...

  8. Oracle之用户和表空间

    用户和表空间 看具体下载什么来操作?(oracle  11g,终端) 如果不在虚拟桌面, 它在整个总账项目里占什么位置? 如何使用? 不管学什么都要及时复习和总结,很重要. 增删改查  decode  ...

  9. php 一个文件搞定支付宝支付,微信支付

    博客:https://me.csdn.net/jason19905 支付宝支付:https://github.com/dedemao/alipay 微信支付:https://github.com/de ...

  10. curl 异步捉取数据类

    <?php class RequestLib { /** * GET 请求 * @param string $url */ public static function http_get($ur ...