所有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. 解决bash: less: command not found

    问题描述 使用less命令查找日志时,less命令未找到: 解决办法 安装less,执行如下命令: npm install -g less

  2. 在x64计算机上捕获32位进程的内存转储

    这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...

  3. P5589 【小猪佩奇玩游戏】

    这题还是比较妙妙套路的,复杂度为\(O(log^2N)\),可以卡掉\(\sqrt n\)的做法 首先我们可以把原数列分成很多个集合,集合之间肯定是两两独立的,考虑分别计算答案 我们定义\(f_i\) ...

  4. linux命令之------Cat命令

    Cat命令 作用:cat命令用于连接文件并打印,查看文件内容: -n或--number:由1开始对所有输出的行数编号: -b或--number-nonblank:和-n相似,只不过对于空白行不做编号: ...

  5. MSSQL手工注入 报错注入方法

    例子:www.kfgtfcj.gov.cn/lzygg/Zixun_show.aspx?id=1[1]首先爆版本:http://www.kfgtfcj.gov.cn/lzygg/Zixun_show. ...

  6. mysql right() 函数

    mysql> ); +---------------------+ | right() | +---------------------+ | dedede | +--------------- ...

  7. c++ 获取字符串中最长的回文子串

    #include <vector> #include <iostream> #include <string> using namespace std; strin ...

  8. 多语言编程必备的十大 Vim 插件

    原文地址:http://www.linuxeden.com/a/58769 使用这 10 个 Vim 插件,可以让你在写代码或运维时,感觉更棒. 我使用 Vim 文本编辑器大约 20 年了.有一段时间 ...

  9. java生成HMACSHA256的方法

    data要加密的数据,key密钥 public static String HMACSHA256(String data, String key) throws Exception { Mac sha ...

  10. Linux设置开机挂载

    Linux可不可以在开机的时候就将我们要的文件系统都挂载好?这样就不需要每次进入Linux系统还要挂载一次.当然可以,那就直接到/etc/fstab里面去修改. 系统挂载的一些限制: - 根目录/是必 ...