根据元素的特征,来确认元素的条件,然后根据条件去找到唯一的那个元素
所有查找元素方法会返回WebElement对象,可以通过操作WebElement对象来操作html元素

八大元素定位方法:

其中
6大定位方法:
id、name、 class_name、 tag_name、 link_text、 partial_link_text
只根据元素的一个属性来定位,要求页面的元素非常标准

2大定位方法:万能定位
css_selector、xpath
多个属性组合来找元素,或者通过其他的关系来找元素

一、id:元素的id是当前整个HTML页面中唯一的,是首选的(动态变化的id不做考虑)

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 搜索输入框
element = driver.find_element_by_id("kw") # WebElement对象-- 一个对象对应一个元素
element.send_keys("selenium webdriver")

第二种方法:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 搜索输入框
element = driver.find_element_by(By.ID, "kw") # WebElement对象-- 一个对象对应一个元素
element.send_keys("selenium webdriver")

二、name:会有重复name的情况,概率不高。不是唯一的

driver.find_element_by_name("")
driver.find_element(By.NAME, "")

三、class_name:class主要用于元素进行分组,并对这一级元素设置相同的样式,所以class属性在当前html页面当中,也不是唯一定位到一个元素的,class的属性只有一个值

driver.find_element_by_class_name("")
driver.find_element(By.CLASS_NAME, "")

四、tag_name:元素的标签名称,如input、div、span等

driver.find_element_tag_name("")
driver.find_element(By.TAG_NAME, "")

五、link_text:用于链接a标签的 - 精准匹配

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# driver.find_element_link_text("新闻")
# 定位百度首页新闻并点击
driver.find_element(By.LINK_TEXT, "新闻").click()

六、partial_link_text:用于链接a标签的, 匹配部分文本值 - 模糊匹配

driver.find_element_paritial_link_text("闻")
driver.find_element(By.PARITIAL_LINK_TEXT, "闻")

七:css:通过组合的方式进行定位,和XPATH定位方式基本相同。-- 晦涩难懂

driver.find_element_by_css_selector(css表达式)
driver.find_element(By.CSS_SELECTOR, "")

八:Xpath定位: - 语法好懂 - F12下elements当中,按ctrl+f 弹出表达式确认框
1.绝对定位(一般不用,动态变化的会出错)—以/开头,父/子

/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input 继承顺序:位置顺序

2.相对定位 不用考虑继承位置顺序,靠自己的特征定位,不在乎在哪–以//开头

1.//标签名[@属性=值]
//*[@*="wrapper"]    # 只要有一个属性的值满足这个就可以用*
2.文本匹配
//标签名[text()=值]  # 要求唯一值
3.包含 模糊匹配
//标签名[contains(@属性/text(),值)]
4.逻辑运算 来组合更多的元素特征 and or
//标签名[@属性=值 and @属性=值 and contains(@属性,值) and text()=值]
5.层级定位 //一级元素//二级元素//....
出现表格一样的东西的时候会用 
 //class[@id="wrapper"]//input[@id="kw"]
6.轴定位:关系 - 需要分析元素之间的关系。页面的结构
轴运算:
ancestor:祖先节点,包括父
parent:父节点
preceding:当前元素节点标签之前的所有节点,html页面先后顺序
preceding-sibling:当前元素节点标签之前的所有兄弟节点
following:当前元素节点标签之后的所有节点,html页面先后顺序
following-sibling:当前元素节点标签之后的所有兄弟节点
使用语法:
已知的元素/轴名称::标签名称[@属性=值]
        1).通过兄弟姐妹找到自己
        2).通过后代元素来找到祖先元素
//p[@title="标题"]/following-sibling::p[@class="stuno"]
//p[@title="标题"]/following-sibling::* 后面的所有兄弟姐妹--加[1]为下标
//p[@title="标题1"]/parent::*/following-sibling::li//p[@class="name"]
7.下标/js
有时候下标会失效,分析发现,使用下标要注意节点分支  可以用element + 下标
/html/body/div[4]/div[1]/div[1]/div[1]/div[3]/div/a
/html/body/div[4]/div[1]/div[2]/div[1]/div[3]/div/a
/html/body/div[4]/div[1]/div[3]/div[1]/div[3]/div/a
可以发现div其中一个节点分了3个分支。