webdriver(python)学习笔记五——层级定位

层级定位

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

假如有两个控件,名称相同,但是略微有一些区别,如一个在北京,一个在上海,要怎么定位找到他们呢,可以根据区别层级不同按城市、区、街道,分级寻找。

代码:level_locate.hmtl

<html>
        <head>
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />
            <title>Level Locate</title>     
            <script type="text/javascript" async="" src="https://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>

HMLT打开效果如下图所示:

上面的代码显示,页面有两个文字链接,点击两个链接会弹出一模一样的的两个下拉菜单,这两个菜单的属性基本一样。那么我如何区分找到相应的菜单项呢?由于两个下拉菜单中每个选项的link text都相同,href也一样,所以在这里就需要使用层级定位了。

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

 

# coding:utf-8

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from time import sleep
import os

dr=webdriver.Firefox()
file_path='file:///'+os.path.abspath('level_locate.html')
dr.get(file_path)

#点击link链接(弹出下拉列表)
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()

sleep(1)

dr.quit()

脚本解释:
1、WebDriverWait(dr,10)   10秒内每隔500毫秒扫描一次页面变化,当出现元素后结束。dr已在脚本中定义。

2、is_displayed   指该元素是否用户可见

3、ActionChains(dr)  生成用户行为,所有行动都存储在ActionChains中,通过perform()存储的行为。

4、move_to_element(menu)  移动鼠标到一个元素中,menu指定指向哪一个元素。to_element指元素移动到

 

运行效果(下拉列表菜单处于选中状态)如下图所示:

 

 

 

posted @ 2014-01-26 15:36  milkty  阅读(1273)  评论(1编辑  收藏  举报