前言

在前面的Selenium系列文章中,已经介绍过元素定位的方法,也强调过元素定位对自动化操作的重要性。本节将介绍一种分层定位思想,该思想主要用于解决目标元素无法直接定位的场景。


现在想象这样一个场景:朋友请你去KFC吃炸鸡汉堡, KFC在城市的各个区都有的,所以你要先确定是哪个区哪个街道的KFC,根据位置属性从大到小逐级查找,这是符合逻辑的查找思路。在这个场景里,因目标属性相同(KFC不仅名字相同,风格也是统一的),所以不能直接根据最直观的名称属性查找(存在相同)。在Web UI的世界里,也存在类似情况,目标元素很可能属性是完全相同的,无法直接定位或者定位到的并不是目标元素。此时,可以利用现实世界的思维,先找目标元素的父级元素,再沿着确定的父级元素寻找下级的目标元素。


简言之,分层定位的思想是:先定位父元素,然后再根据父元素遍历其子元素,选择需要的目标元素。

 

分层定位思想的应用场景

分层定位思想主要应用在如下场景:

1、 子级元素无法直接定位,需要先操作父级元素(如二级菜单是在一级菜单点击后才出现);

2、 同一级别的元素属性相同,无法定位到唯一、确定的元素;

3、 定位某个元素下的所有子元素;

接下来,我们使用一个例子进行说明,重点是体会这种思想。

 

分层定位思想实战

假如我们有如下待测页面,其中菜单一菜单二有相同的二级子菜单,两者的子菜单属性完全一致,现在需要对菜单一下的二级菜单B进行操作,因两个菜单都包含有相同属性的二级菜单B,所以不能直接定位,另外,该二级菜单也需要在操作一级菜单后才能进行操作。所以,操作思路是先选中一级菜单,再选择其目标二级菜单进行操作。

1.png

实例html页面主要源码如下:

2.png

 

Python代码如下:

from  selenium import webdriver
from selenium.webdriver.common.by import By
import os

browser = webdriver.Chrome()
#演示用的html和脚本位于同一目录,重点在分层定位思想的讲解
file_path = 'file:///' + os.path.abspath('分层定位思想.html')
browser.get(file_path)

# #点击菜单1打开下拉菜单
browser.find_element(By.LINK_TEXT,'菜单一').click()

#选择菜单一下的二级菜单,且将鼠标移到目标菜单项
level_menu = browser.find_element(By.LINK_TEXT,'二级菜单B')
webdriver.ActionChains(browser).move_to_element(level_menu).perform()


四 其他资源

关于python学习、分享、交流,笔者开通了微信公众号【小蟒社区】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学python。