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打开效果如下图所示:

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

上面的代码显示,页面有两个文字链接,点击两个链接会弹出一模一样的的两个下拉菜单,这两个菜单的属性基本一样。那么我如何区分找到相应的菜单项呢?由于两个下拉菜单中每个选项的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指元素移动到

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

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

上一篇:一句话解释c#中的特性,你了解多少


下一篇:Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.`的解决办法