• 0
  • 0
分享
  • Web自动化元素定位——软件测试圈
  • 北极 2022-02-21 10:27:04 字数 3124 阅读 961 收藏 0

元素定位就是通过元素的信息或元素层级结构来定位元素。要使用Web自动化操作元素,必须首先找到此元素。

1 元素定位方式

1.1 基于元素属性特有的定位方式

(1)id: element = driver.find_element_by_id(id)

id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的。

(2)name: element = driver.find_element_by_name(name)

name定位就是根据元素name属性来定位。HTML文档中name的属性值是可以重复的

(3)class_name: element = driver.find_element_by_class_name(class_name)

class_name定位就是根据元素class属性值来定位元素。HTML通过class来定义元素的样式。如果class有多个属性值,只能使用其中的一个。

1.2 基于元素标签名称定位

tag_name: element = driver.find_element_by_tag_name(tag_name)

tag_name定位就是通过标签名来定位,HTML本质就是由不同的tag组成, 每一种标签一般在页面中会存在多个,所以不方便进行精确定位,一般很少使用,如果存在多个相同标签,则返回符合条件的第一个标签。

1.3 基于超链接文本

(1)link_text: element = driver.find_element_by_link_text(超链接的全部文本内容)

link_text定位是专门用来定位超链接元素(<a>标签</a>), 并且是通过超链接的文本内容来定位元素

(2)partial_link_text: element = driver.find_element_by_partial_link_text(这里可以是a标签的部分文本内容)

1.4 基于元素路径xpath的定位策略

XPath即为XML Path的简称,是一门在 XML 文档中查找元素信息的语言。HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。XML是一种后缀名为.XML的标记语言,用于数据的存储和传递。

定位方法: element = driver.find_element_by_xpath(xpath)

1.4.1 路径定位

(1)绝对路径定位:从最外层元素到指定元素之间所有经过元素层级的路径

绝对路径以/html根节点开始, 使用/来分隔元素层级;如: /html/body/input;绝对路径对页面结构要求比较严格,一般不使用绝对定位

(2)相对路径定位:匹配任意层级的元素,不限制元素的位置

相对路径以//开始,如: //input 或者 //*

1.4.2 元素属性定位

//任意节点[@属性=‘属性值’] or //*[@属性=属性值]

扩展:

  • //包括有文本信息的节点[contains(text (),‘文本信息’)],如表达式://a[contains(text(),‘新闻活动’)]

  • 属性中含有xxx的元素://*[contains(@属性名,‘XXX’)]

  • 属性以xxx开头的元素://*[starts-with(@属性名,‘XXX’)]

1.4.3 属性与逻辑结合定位

//*[@属性名1='属性值1 and @属性名2=‘属性值2’]

解决元素之间个相同属性重名问题

1.4.4 层级与属性结合定位

//*[@属性名=‘属性值’]/标签等

若通过元素自身属性不方便直接定位到该元素,则可以先定位到其父级元素,然后再找到该元素

1.5 基于选择器css的定位策略

在selenium中,CSS定位比XPath定位速度要快,推荐使用。

定位方法: element = driver.find_element_by_css_selector(css_selector)

1.5.1 id选择器: #id属性值

1.5.2 class选择器: .class属性值

1.5.3 元素选择器: 标签名

根据元素的标签名选择,如:input

1.5.4 属性选择器:[属性名=属性值] 或 标签名[属性名=属性值]

根据元素的属性名和值来选择,如:[type=“password”]

扩展:

  • 某属性以某字母开头的元素:标签名[属性名^=‘属性值’]

  • 某属性以某字母结束的元素:标签名[属性名$=‘属性值’]

  • 某属性包含某字母的元素:标签名[属性名*=‘属性值’]

1.5.4 层级选择器

根据元素的父子关系来选择。

格式1: 元素1>元素2,通过元素1来定位元素2,并且元素2必须为元素1的直接子元素,如:p[id=‘p1’]>input (定位指定p元素下的直接子元素input)

格式2: 元素1 元素2,通过元素1来定位元素2,并且元素2为元素1的后代元素,如:p[id=‘p1’] input(定位指定p元素下的后代元素input)

1.6 定位一组元素

get_elements_by_xxx()

返回的定位元素格式为列表,通过指定下标读取列表中的数据。

1.7 定位工具:火狐插件chropath

step1: 在火狐浏览器中搜索并安装插件ChroPath

1.jpg

step2: 打开开发者工具,点击ChroPath,之后点击箭头小图标,鼠标移动到页面上选择需要执行操作的元素

2.jpg

step3: 在ChroPath面板中选择元素定位策略

3.jpg

step4: 查看元素路径

4.jpg

2 常见问题解决方案:

2.1 问题1:提示错误: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

解决方法:

step1: 导入By类:from selenium.webdriver.common.by import By

class By(object):
    """
    Set of supported locator strategies.
    """
    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

step2: 更改元素定位语句为:driver.get_Element(By.ID,“id名”)

NAME,CLASS_NAME,XPATH等写法一样

find_element_by_id底层实现方法是调用find_element方法进行的封

装。

def find_element_by_id(self, id_):
    """Finds an element by id.
    :Args:
    - id\_ - The id of the element to be found.
    :Usage:
    driver.find_element_by_id('foo')
    """
    return self.find_element(by=By.ID, value=id_)


作者:艸予恬

原文链接:https://blog.csdn.net/qq_38684868/article/details/122029658

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   苹果公司正在开发新的 iPad 和 MacBook 机型,但彭博社的马克-古尔曼(Mark Gurman)认为,这些设备"不会在本月发布"。古尔曼在今天的《Power On》时事通讯中说:  "通常情况下,苹果会在 10 月份发布新款笔记本电脑和iPad,也就是在最新款iPhone和手表上市一个月之后。虽然我在 7 月份曾报道过苹果计划在今年发布这样的产品,但最新的迹象表明,它不会在本月发布。"  古尔曼接着说,新款 iPad Air、iPad mini 和入门级 iPad 机型都在开发中,配备了速度更快的芯片,但他并不认为"任何重要的更新...
            0 0 1137
            分享
          • 前言: 作为测试人员,和我们最常打交道的,莫属bug。当你发现bug后,会采取什么样的行动?是直接报出来,亦或找找问题原因?不管是我们自己找到的,亦或是开发修复后告诉我们的,知道问题之所在总是好的。在本篇文章中,笔者试图带领大家一起梳理下,为什么测试人员定位问题很重要,以及我们可以使用什么样的定位方法。一、定位问题的重要性很多测试人员可能会说,我的职责就是找到bug,至于找原因并修复,那是开发的事情,关我什么事?好,我的回答是,如果您只想做一个测试人员最基本最本分的事情,那么可以这么想。但是,如果您想要在测试甚至开发的道路上长足发展,就要知其所以然。那么,为什么定位问题如此重要?可以...
            9 10 4158
            分享
          •   对测试自动化的依赖性增加导致大量自动化软件测试工具的出现,使得很难确定哪些是最好的。为了帮助您完成自动化工作,我们根据自己和他人的经验创建了五大最佳自动化软件测试工具列表。  1. Selenium  Selenium可以说是web开发人员和测试人员中最受欢迎的自动化软件测试工具。它于2004年首次发布,从那时起它发生了很大变化。最新版本的Selenium包含几个组件,包括Selenium IDE和Selenium WebDriver。  Selenium IDE是一个用于Selenium测试的完整集成开发环境(IDE),主要用于创建快速错误复制脚本和脚本,以帮助进行自动化辅助探索性测试。...
            0 0 264
            分享
          •   1、用户定义的变量  当我们每次去调用接口都要手动修改手机号码,并且注册和登录接口都要同步修改,这样操作相当繁琐,针对这个问题我们使用用户定义的变量的工具进行优化。  添加:在线程组上:右键—>添加—>配置元件—>用户定义的变量  用户自定义变量是固定的,与下面的“用户参数”有点不同(比如:${__Random(1000,9999,)},多个虚拟用户请求时,生成的四位数都是固定同一个)  我们把注册和登录的手机号和密码都提取出来放到这里。  定义了之后,我们需要调用该参数,调用方式是在对应的取样器里,使用${key}的格式替换取样器请求体里的值,这样我们就可以每次只修改一...
            0 0 1145
            分享
          •   据报道,当地时间周三,OpenAI表示,已经修复ChatGPT一个明显漏洞,因为该漏洞的存在,少数用户可以看到其它用户与AI对话历史记录的标题。  OpenAI首席执行官山姆·阿尔特曼也发推文称,因为修复漏洞,太平洋标准时间3月20日部分时间无法查看个人聊天历史记录。  自去年推出以来ChatGPT快速成长,许多人试用。上周OpenAI将GPT-3.5升级到GPT-4,11月30日之前向用户开放。  市场分析咨询公司Similarweb认为,微软已经向OpenAI投入巨资,必应搜索整合ChatGPT能让搜索变得更有魅力,吸引更多人使用。作者:佚名原文链接:新浪科技_新浪网(sina.com...
            0 0 921
            分享
      • 51testing软件测试圈微信