zoukankan      html  css  js  c++  java
  • web自动化测试之8大元素定位方法

    # -*- coding:utf-8 -*-
    # @Time : 2019/11/18 20:00
    # @Author : panpanda
    # @File : 查找元素.py

    from selenium import webdriver

    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com/")

    """
    页面元素的8大定位方式:
    第1类、靠元素的单一属性查找:6种定位方法(id,)
    第2类、组合属性来定位元素:2种定位方法(xpath,css选择器)

    ⚠️:所有查找元素方法均会返回WebElement对象,可以通过操作WebElement对象来操作html元素
    """

    # 一:id -- 身份证,具有唯一性
    # 注意id为动态变化的情况(可以多访问几次观察一下id是否可变) Ps:下方两种写法是等价的
    element = driver.find_element_by_id("kw")
    element2 = driver.find_element("id", "kw")
    # element2.get_attribute("")
    # driver.back()
    # driver.refresh()

    # 元素可用(is_enabled):主要针对 按钮 和 输入框
    # 按钮:天生就是可点击的,如果不可点击(disabled属性),则表示按钮不可用
    # 输入框:天生就是让用户输入文本信息的,如果不可输入(readonly属性),则表示输入框不可用

    # 元素可选:主要针对 复选框checkbox 和 单选radio

    # 输入操作:send_keys
    # 点击操作:click

    # 元素是否可见:is_display,元素在页面中是否可见分为三种"元素存在、元素可见、元素可用"状态
    # 元素存在find < 元素可见display < 元素可用enable (元素只有存在了,才能可见,元素只有可见了,才能可用)

    # 二:tag_name -- 标签名
    driver.find_element_by_tag_name("input") # 返回第一个匹配到的元素
    driver.find_elements_by_tag_name("input") # 返回所有匹配到的元素列表,列表中都是WebElement对象

    # driver.find_element("tag_name", "input")
    # driver.find_elements("tag_name", "input")

    # 三、四:name、class -- 元素的name属性、class属性
    driver.find_element_by_name("")
    driver.find_elements_by_name("")

    driver.find_element_by_class_name("") # class可以有多个属性,但此处只能填写一种class属性
    driver.find_elements_by_class_name("")

    # 五、六:link_text/partial_link_text -- 针对文本链接元素
    driver.find_element_by_link_text("link_text") # 精准匹配
    driver.find_element_by_partial_link_text("partial_link_text") # 模糊匹配

    # driver.find_elements_by_link_text("link_text")
    # driver.find_elements_by_partial_link_text("partial_link_text")

    # 七:xpath -- 万能定位
    # 绝对定位:/开头,严格按照DOM树级路径、同级的位置。--- 很不稳定
    # 相对定位:不关注位置、路径,以当前html页面为参照物。 //开头
    """
    /与//的区别:/后必须是父子关系;//后包括但不限于父子关系,只要是后代元素都可以
    """

    # 相对定位基本用法://标签名[@属性名称=属性值] 如://input[@name="name"] --- 元素单一属性时
    # 逻辑运算://标签名[@属性名称=属性值 and/or @属性名称=属性值] 如://input[@name="name" and @type="text"] --- 元素有多属性时
    # 层级定位://标签名[@属性名称=属性值]//标签名[@属性名称=属性值]...
    # 部分匹配定位://标签名[contains(@属性名称/text(),"要包含的属性值/文本值")]
    # 元素文本定位(全匹配)://标签名[text()="文本值"]
    # 轴定位:(实质上是通过目标元素的家族关系元素来查找到唯一目标元素,能用以上方法定位到的元素就没必要用轴定位来定位元素)
    """
    轴运算:
    1、ancestor:祖先节点,直系
    2、parent:父节点
    3、preceding:当前元素节点标签之前的所有节点(html页面先后顺序)
    4、preceding-sibling:当前元素节点标签之前的所有兄弟节点(直系)
    5、following:当前元素节点标签之后的所有节点(html页面先后顺序)
    6、following-sibling:当前元素节点标签之后的所有兄弟节点(直系)

    使用语法:已知的元素/轴名称::标签名称[@属性名称=属性值]
    如://dd[@data-val="潘潘达"]/following-sibling::dd[contains(@class,"batscore")]
    """

  • 相关阅读:
    php配置修改后,平滑启动php-fpm
    php-fpm参数调优
    php-fpm 高并发 参数调整 转
    redis分布式锁
    MySQL中group_concat函数 --- 很有用的一个用来查询出所有group by 分组后所有 同组内的 内容
    MySQL中information_schema 数据库 是干什么的
    Mysqldump参数大全 这 些参数 不同于 mysql 的那些参数(下边文章开头有链接) :2 种类型的参数含义是不一样的
    mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的
    not found 什么时候触发
    intellJ svn控制错误
  • 原文地址:https://www.cnblogs.com/panpanda/p/12023444.html
Copyright © 2011-2022 走看看