zoukankan      html  css  js  c++  java
  • 轻松自动化---selenium-webdriver(python) (五)

     http://www.testclass.net/  测试教程网,专业的selenium 学习网站。

    本节要解决的问题:

    • 层级定位

     

    场景:

      假如两个控件,他们长的一模样,还都叫“张三”,唯一的不同是一个在北京,一个在上海,那我们就可以通过,他们的城市,区,街道,来找到他们。

     

      在实际的测试中也经常会遇到这种问题:页面上有很多个属性基本相同的元素,现在需要具体定位到其中的一个。由于属性基本相当,所以在定位的时候会有些麻烦,这时候就需要用到层级定位。先定位父元素,然后再通过父元素定位子孙元素。

    复制代码
    <html>
        <head>
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />
            <title>Level Locate</title>        
            <script type="text/javascript" async="" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
            <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />        
        </head>
        <body>
            <h3>Level locate</h3>
            <div class="span3">        
                <div class="well">
                    <div class="dropdown">
                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Link1</a>
                        <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" id="dropdown1" >
                            <li><a tabindex="-1" href="#">Action</a></li>
                            <li><a tabindex="-1" href="#">Another action</a></li>
                            <li><a tabindex="-1" href="#">Something else here</a></li>
                            <li class="divider"></li>
                            <li><a tabindex="-1" href="#">Separated link</a></li>
                        </ul>
                    </div>                
                </div>            
            </div>
            <div class="span3">        
                <div class="well">
                    <div class="dropdown">
                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Link2</a>
                        <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" >
                            <li><a tabindex="-1" href="#">Action</a></li>
                            <li><a tabindex="-1" href="#">Another action</a></li>
                            <li><a tabindex="-1" href="#">Something else here</a></li>
                            <li class="divider"></li>
                            <li><a tabindex="-1" href="#">Separated link</a></li>
                        </ul>
                    </div>                
                </div>            
            </div>
        </body>
        <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
    </html>
    复制代码

    将这段代码保存复制到记事本中,将保存成level_locate.html文件,(注意,这个页面需要和我们的自动化脚本放在同一个目录下)浏览器打开:

     

      这里自制了一个页面,上面有两个文字链接,点击两个链接会弹出一模一样的的两个下拉菜单,这两个菜单的属性基本一样。那么我如何区分找到相应的菜单项呢?

     

    方法如下:

    复制代码
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    import time
    import os
    
    dr = webdriver.Firefox()
    file_path =  'file:///' + os.path.abspath('level_locate.html')
    dr.get(file_path)
    
    #点击Link1链接(弹出下拉列表)
    dr.find_element_by_link_text('Link1').click()
    
    #找到id 为dropdown1的父元素
    WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed())
    #在父亲元件下找到link为Action的子元素
    menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
    
    #鼠标定位到子元素上
    webdriver.ActionChains(dr).move_to_element(menu).perform()
    
    time.sleep(2)
    
    dr.quit()
    复制代码

    定位思路:

    具体思路是:先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul下的某个具体的link。在这里,我们定位第1个下拉菜单中的Action这个选项。

     ---------------------------------------------------------------------

    虽然我每行代码前叫了注释,但可能还是不太容易理解,因为里面多了不少以前没见过的新东东。

    WebDriverWait(dr, 10) 

    10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。dr就不解释了,前面操作webdriver.firefox()的句柄

     

    is_displayed()

    该元素是否用户可以见

     

    class ActionChains(driver)

    driver: 执行用户操作实例webdriver 

    生成用户的行为。所有的行动都存储在actionchains对象。通过perform()存储的行为。

     

    move_to_element(menu)

    移动鼠标到一个元素中,menu上面已经定义了他所指向的哪一个元素

    to_element:元件移动到

     

    perform()

    执行所有存储的行为

     ------------------------------需要我们日常工作中细细品味、慢慢消化这些函数的用法

     

    其实,啰嗦了这么多,我们只是想达到一种效果,“下拉列表中Action选项处于被选中状态”,通过鼠标移动到选项上就达到到了这种效果,但通过程序模拟确实比较麻烦:

     

     

     

    --------------------------

    学习更多selenium 内容:

     「功能测试自动化」汇总

  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/Raul2018/p/9359035.html
Copyright © 2011-2022 走看看