# -*- 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")]
"""