所有web网页中有8种元素定位方式

靠单一的特征找元素:6种(id,class_name,tag_name,name,link_text(2))
组合各种特征和关系来找元素:2种(xpath,css)

以下4种方法对所有元素可用

1.id:唯一,id不变时首选它。

# 一个元素有很多属性时,元素定位优先级首先是id,但id有时是变的,如果id是不变的,可用它来定位。
# 如果id是变化/动态的,那么要舍弃id定位方式,换别的。
# 以百度首页为例:
# 这里定位策略是id,定位表达式是id="kw"。
ele = driver.find_element_by_id("kw")
# 元素有属性+操作-----返回的是webElement对象(所以selenume中对元素是做了一层封装的)
# driver所有的查找方法都是find_element开头,所有的查找结果都是webElement。
# id在web网页中只会找到一个元素,所以只有一个对象可以返回.
# 如果找到的是多个,须纠正开发.
print(ele)

2.标签名称 tag_name:可以找到一个或多个,不唯一,所以查找方法都一样。

ele = driver.find_element_by_tag_name("input")   # 在DOM/html中匹配到的第一个元素
print(ele) eles = driver.find_elements_by_tag_name("input")   # 多个,返回的是列表,元素为webElement对象,页面中全部匹配的元素.
# 按整个html页面从上到下一层层找
print(eles)

3.class_name(不唯一):同上。

ele1 = driver.find_element_by_class_name("")
print(ele1) ele2 = driver.find_elements_by_class_name("")
print(ele2)
 
 

4.name(不唯一):同上。

# 虽name很多时候重名,但尽可能不重名,每个人都有自己的一个名字,名义上不绝对唯一,但很多时候唯一性很高
ele3 = driver.find_element_by_name
print(ele1) ele4 = driver.find_elements_by_name
print(ele1)

a元素:两种方法

5.完整匹配文本值

driver.find_element_by_link_text("更多产品")
# a链接的文本必须是"更多产品"4个字
# 全量匹配,完全匹配
# 不是绝对唯一:一个页面中允许多个链接文本值是一样的
# 当前页面中,任何一个元素只要它的文本值是‘更多产品’,那就完全匹配.

6.部分匹配/包含

driver.find_elements_by_partial_link_text("产品")  
# 只要a元素的文本内容中有"产品"两字,就符合要求.

以上6种方法在使用时,可能有时候会找不到元素,或者找到了后面又变了。所以用xpath或css组合定位。

7.xpath定位

# 绝对定位:路径绝对(兼容差,过度依赖位置和继承关系)  从祖先开始到本身  以/开头  /父/子
# 相对定位: 
# 在整个html页面,逐个条件,找到唯一的元素。
# 摆脱位置和继承关系,web自动化首选。
# 按ctrl+f打开下面的输入框使用相对路径进行查找
# 多个属性:通过逻辑运算and/or

1>.以//开头,//标签名[@属性名=值]     如果标签名是*,匹配所有标签。

//input[@id="kw"]  # 找属性id,值为kw的元素

2>.多个属性:通过逻辑运算and/or

//*[@id="kw" and @name="wd" and @class="s_ipt"]  # 同时满足
//*[@id="kw" or @name="wd" or @class="s_ipt"] # 满足其中一个

3>.通过元素的文本内容来定位---文本内容固定才可用----函数  //标签名[text()=对应的文本值]

//p[text()="平均出勤率"]

4>.包含:属性/文本内容包含一部分即可-----//标签名[contains(@属性/text(),被包含的内容)]

# 属性包含方式:
//span[contains(@class,"quickdelete-wrap")]
# 文本包含方式:
//h1[contains(text(),"第2期")]
# 包含与逻辑and/or相结合
//h1[contains(text(),"第2期") and @id="ccc"]

5>.层级定位: 

# 通过父辈/祖先辈
# 以百度首页为例:
# 定位登录元素
# 它是一个a链接,有链接地址,有name/class/onclick属性,文本内容。
# 首选name属性定位
//a[@name="tj_login"]
# 会出现两个元素,不知道是哪个,可以将鼠标分别放在两个黄色部分,会显示定位路径/元素特征的就是要找的元素。

两个元素一模一样,靠它自己本身根本找不到。

用find elements找到所有匹配的元素,然后通过下标取值。

两个一模一样分不清,可能爹/祖先不一样。

通过父辈/祖先辈,先找到不一样的先辈,在先辈下面再找。------层级定位

# 通过父辈找元素:
# /只能跟直系后代(会限制前后关系:父/子)
# //只要是后代就行
//div[@id="u1"]/a[@name="tj_login"]

6>.轴定位:多用于表格

已知元素/轴名称::标签名称[@属性=值]

轴运算:

ancestor:祖先结点,包括父。

parent:父结点

preceding:当前元素节点标签之前的所有结点。(html页面先后顺序)

preceding-sibling:当前元素节点标签之前的所有兄弟结点。

following:当前元素节点标签之后的所有结点。(html页面先后顺序)

following-sibling:当前元素节点标签之后的所有兄弟结点。

8.css定位


web页面元素定位的更多相关文章

  1. Python3.x:Selenium中的webdriver进行页面元素定位

    Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver ...

  2. java selenium webdriver实战 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  3. Robot Framework 教程 (2) - 页面元素定位

    上一篇文章中,简单模拟了一个baidu搜索并截图的过程,在搜索过程中,我们需要对搜索框.搜索按钮进行定位.本篇文章主要介绍一下具体的定位方法. 我们的脚本如下: *** Settings *** Li ...

  4. 页面元素定位 XPath 简介

    页面元素定位 XPath 简介 本文所说的 Xpath 是用于 Selenium 自动化测试所使用到的,是针对XHTML网页而言的一种页面元素的定位表示法. XPath 背景 XPath即为XML路径 ...

  5. java selenium webdriver第二讲 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  6. 5、通过Appium Desktop实现页面元素定位

    之前我们已经安装了Appium Desktop,下面就让我们使用Appium Desktop实现页面元素定位 1.首先我们打开Appium Desktop,进入如下界面,点击Start Server ...

  7. 用XPath定位Web页面元素时,如何快速验证XPath语句是否正确?

    在使用Selenium做Web UI自动化测试的过程中,XPath是一种定位页面元素的常用方式.然而,面对某些元素的XPath路径过于复杂,我们想快速验证拼凑的Xpath语句是否正确时,该怎么办呢?这 ...

  8. Selenium with Python 003 - 页面元素定位

    WebUI自动化,首先需要定位页面中待操作的元素,然后进行各种事件操作,这里我们首先介绍Selenium Python 如何定位页面元素,WebDriver 提供了一系列的方法. 定位单个页面元素(返 ...

  9. 使用webview查找元素,appium查找web页面元素

    9 webview查找元素 9.1 webview 简介 WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面.它使用的内核是webkit引擎,4.4版本之后,直接使用 ...

随机推荐

  1. 用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)

    1.概述 在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动.但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的 ...

  2. 开发框架Express

    一.使用原因 由于nodejs原生的http核心模块在某些方面不足以应对开发需求,所以就需要使用框架来加快开发效率,让代码更高度统一.在nodejs中有许多web开发框架,以下介绍Express的使用 ...

  3. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

    https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public p ...

  4. SQL必知必会收集学习

    1.按查询列位置排序:如按第一列 降序排序 desc

  5. 洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying 题解

    P2983 [USACO10FEB]购买巧克力Chocolate Buying 题目描述 Bessie and the herd love chocolate so Farmer John is bu ...

  6. webapp接口安全设计思路

    在做webqq或者说app开发的时候,免不了会有接口是有权限的(如查询用户敏感信息等),这时接口安全设计思路就非常重要了. 简单一点,在APP中保存登录数据,每次调用接口时传输 程序员总能给自己找到偷 ...

  7. 鱼塘钓鱼(fishing)(信息学奥赛一本通 1373)

    [问题描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,……,第5分钟以后再 ...

  8. mapreduce数据处理——统计排序

    接上篇https://www.cnblogs.com/sengzhao666/p/11850849.html 2.数据处理: ·统计最受欢迎的视频/文章的Top10访问次数 (id) ·按照地市统计最 ...

  9. ggplot常见语法汇总查询

    主图 散点图 柱状图 折线图 小提琴图 点图 进化树 圈图 Alluvial图 Sankey Diagram plot(getSankey(colData(muraro)$cell_type1, mu ...

  10. Spring的异步方法

    先把longTimeMethod 封装到Spring的异步方法中,这个异步方法的返回值是Future的实例.这个方法一定要写在Spring管理的类中,注意注解@Async. @Service publ ...