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