所有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. shell grep的基本用法

    grep 1.-i 不区分大写小写 2.-n 区分大小写 3.-E 查找多个条件 4.-c 查找到的结果的行数 5.-w 精确查找 6.取反 7.-q 静默输出

  2. omnibus-gitlab 架构学习

    omnibus-gitlab是gitlab 团队fork 自chef 的omnibus 项目,同时做了一些自定义的开发,omnibus-gitlab 简化了 gitlab 的部署以及维护,同时里边集成 ...

  3. web 视频播放器clappr 相关

    https://github.com/tjenkinson/clappr-thumbnails-plugin/ https://github.com/andrefilimono/clappr-flvj ...

  4. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

  5. java JBDC操作

    类似:c# 里面的ado.net  增删改查,动手做Demo  (当然实际企业开发很少用这种方式 ). ps:以前从一开始 搞ssm spring Boot spring Mvc 什么都懂一点.什么都 ...

  6. FusionInsight,一个融合的大数据平台

    随着物联网技术和应用的普及,以运营商.互联网以及实体经济行业为代表的企业产生了越来越多的数据,大数据的发展越来越蓬勃. 从2007年开始,大数据应用成为很多企业的需求,2012年兴起并产生了大数据平台 ...

  7. 如何使用git把本地代码上传(更新)到github上

    最近用到git和github记录一下 1.下载git并安装 到官网下载并安装就行了 *如果下载失败,或者太慢,可以复制链接到迅雷下载 2.上传 1.在github新建存储库 库名不能是中文 2.在需要 ...

  8. Docker for mac开启docker api调用

    docker-java 支持unix socket调用的 DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefa ...

  9. 每天有300W的pv,我们单台机器的QPS为58,大概需要部署几台这样机器?

    每天有300W的pv,我们单台机器的QPS为58,大概需要部署几台这样机器? 一.总结 一句话总结: ( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS) 13 ...

  10. gogs 邀请协作者 500错误

    触发原因: 对db文件的user表删了某个用户导致 解决: 注册个新用户,把id改成原来的id(默认都会自增长)