Selenium的八种定位方式
1. 通过 ID 定位
ID 是最直接和高效的方式来定位元素,因为每个页面中的 ID 应该是唯一的。
from selenium import webdriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver.get('https://example.com')
# 通过 ID 定位
element = driver.find_element(by=By.ID, value='element_id')
print(element.text)
2. 通过 Name 定位
Name 属性也可以用来定位元素,特别是在表单中非常有用。
# 通过 Name 定位
element = driver.find_element(by=By.NAME, value='element_name')
print(element.text)
3. 通过 Class Name 定位
Class 名称通常用于样式和脚本中,也可以用来定位元素。注意,一个页面中可能有多个元素共享同一个 class 名称。
# 通过 Class Name 定位
element = driver.find_element(by=By.CLASS_NAME, value='element_class')
print(element.text)
4. 通过 Tag Name 定位
Tag Name 可以用来定位特定类型的 HTML 元素。
# 通过 Tag Name 定位
element = driver.find_element(by=By.TAG_NAME, value='div')
print(element.text)
5. 通过 Link Text 定位
Link Text 用于定位包含特定文本的链接。
# 通过 Link Text 定位
element = driver.find_element(by=By.LINK_TEXT, value='Link Text')
print(element.text)
6. 通过 Partial Link Text 定位
Partial Link Text 用于定位包含部分特定文本的链接。
# 通过 Partial Link Text 定位
element = driver.find_element(by=By.PARTIAL_LINK_TEXT, value='Part of Link Text')
print(element.text)
7. 通过 XPath 定位
XPath 是一种强大的定位方式,可以用来定位页面上的任何元素,特别是当其他方法不够灵活时。
# 通过 XPath 定位
element = driver.find_element(by=By.XPATH, value='//input[@id="element_id"]')
print(element.text)
8. 通过 CSS Selector 定位
CSS 选择器是一种非常灵活的方式,可以用来定位页面上的任何元素。
# 通过 CSS Selector 定位
element = driver.find_element(by=By.CSS_SELECTOR, value='#element_id')
print(element.text)
9.注意事项
- 多元素定位:上述方法都返回单个元素。如果你想找到所有匹配的元素,可以使用
find_elements
方法。 - 等待时间:有时候页面加载较慢,元素可能还没有完全加载出来。在这种情况下,可以使用显式等待或隐式等待来确保元素已经准备好。
1--显式等待示例
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 显式等待直到某个条件满足
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'element_id'))
)
print(element.text)
2--隐式等待示例
# 设置隐式等待时间
driver.implicitly_wait(10) # 单位为秒
# 然后继续你的操作
element = driver.find_element(by=By.ID, value='element_id')
print(element.text)
10.定位的简单使用
# 元素定位 import time from selenium import webdriver from selenium.webdriver.common.by import By # 获取浏览器实例 # 获取谷歌浏览器的驱动 webObj = webdriver.Edge() baiDuUrl ="https://www.baidu.com/" # 打开百度 webObj.get(baiDuUrl) time.sleep(5) # 通过id定位 findElementById = webObj.find_element(By.ID, "kw") print("获取元素的父元素") print(findElementById.parent) # 通过CSS选择器定位 # 使用class选择器 findELementByCssSelectorClass = webObj.find_element(By.CSS_SELECTOR,".s-p-top") # 获取元素的位置 print("获取元素的位置信息") print(findELementByCssSelectorClass.location) # 使用id选择器 fintELementByCssSelectId = webObj.find_element(By.CSS_SELECTOR,"#result_logo") # 获取元素的文本 print(fintELementByCssSelectId.text) # 通过name定位‘ # 使用name属性定位 findElementByName = webObj.find_element(By.NAME,"tn") # 输入元素的文本 print(findElementByName.text) # 通过class定位 # 使用 class和findElements获取元素 findElementByClasss = webObj.find_elements(By.CLASS_NAME,"rsv_pq") # 循环遍历输出这些元素 print("-----------------------------------------") for element in findElementByClasss: print(element.text) print("-----------------------------------------") # 使用Link Text定位 # LinkText这个是精准定位 print("# LinkText这个是模糊定位") settingInfo = webObj.find_element(By.LINK_TEXT,"新闻") print("获取元素的文本信息",settingInfo.text) # 使用PartialLinkText定位 print("# PartialLinkText这个是模糊定位") settingInfo2 = webObj.find_element(By.PARTIAL_LINK_TEXT,"贴") print("获取元素的文本信息",settingInfo2.text) # 通过xpath定位 # 使用class定位 print("使用xpath定位百度的换一换") findElementByXpath = webObj.find_element(By.XPATH, "//*[@id='hotsearch-refresh-btn']/span") print("获取元素的文本信息",findElementByXpath.text) time.sleep(10)
效果图
11.xpath的语法
基本语法
-
1--绝对路径:从根节点开始,使用
/
。/html/body/div
-
2--相对路径:从当前节点开始,使用
//
。//div
节点选择
-
1--选择特定标签名的节点:
//tag_name
-
2--选择具有特定属性的节点:
//tag_name[@attribute_name='value']
-
3--选择具有多个属性的节点:
//tag_name[@attribute_name1='value1' and @attribute_name2='value2']
-
4--选择包含特定文本的节点:
//tag_name[text()='text_value']
-
5--选择包含部分文本的节点:
//tag_name[contains(text(), 'partial_text')]
-
6--选择包含部分属性值的节点:
//tag_name[contains(@attribute_name, 'partial_value')]
节点轴
-
1--选择子节点:
//parent_tag/child_tag
-
2--选择任意后代节点:
//ancestor_tag//descendant_tag
-
3--选择父节点:
//child_tag/..
-
4--选择兄弟节点:
-
1----下一个兄弟节点:
//current_tag/following-sibling::next_tag
-
2----上一个兄弟节点:
//current_tag/preceding-sibling::prev_tag
-
节点位置
-
1--选择第一个节点:
//tag_name[1]
-
2--选择最后一个节点:
//tag_name[last()]
-
3--选择倒数第二个节点:
//tag_name[last()-1]
-
4--选择前两个节点:
//tag_name[position() <= 2]
-
5--选择奇数位置的节点:
//tag_name[position() mod 2 = 1]
组合表达式
-
1--选择多个条件的节点:
//tag_name[@attribute_name='value1' or @attribute_name='value2']
-
2--选择多个路径的节点:
//tag_name1 | //tag_name2
示例
假设我们有一个简单的 HTML 页面:
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Welcome to Example Page</h1>
<p id="intro">This is an example paragraph.</p>
<form>
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<button type="submit">Login</button>
</form>
</body>
</html>
常见 XPath 表达式示例
-
1--通过 ID 定位:
//*[@id='username']
-
2--通过标签名和属性定位:
//input[@type='text']
-
3--通过标签名和多个属性定位:
//input[@type='text' and @name='username']
-
4--通过文本内容定位:
//button[text()='Login']
-
5--通过包含部分文本的属性定位:
//input[contains(@name, 'user')]
-
6--通过父节点定位子节点:
//form/input[@name='username']
-
7--通过索引定位:
//form/input[1]
-
8--通过任意层级的后代节点定位:
//form//input[@name='password']
12.css选择器定位
基本语法
-
1--选择特定标签名的节点:
tag_name
-
2--选择具有特定类名的节点:
.class_name
-
3--选择具有特定 ID 的节点:
#id_name
-
4--选择具有特定属性的节点:
[attribute_name]
-
5--选择具有特定属性值的节点:
[attribute_name='value']
-
6--选择包含部分属性值的节点:
[attribute_name*='value']
-
7--选择以特定值开头的属性值的节点:
[attribute_name^='value']
-
8--选择以特定值结尾的属性值的节点:
[attribute_name$='value']
组合选择器
-
1--选择后代节点:
ancestor_selector descendant_selector
-
2--选择子节点:
parent_selector > child_selector
-
3--选择相邻兄弟节点:
previous_sibling_selector + next_sibling_selector
-
4--选择一般兄弟节点:
previous_sibling_selector ~ next_sibling_selector
伪类选择器
-
1--选择第一个子节点:
:first-child
-
2--选择最后一个子节点:
:last-child
-
3--选择第 n 个子节点:
:nth-child(n)
-
4--选择第 n 个类型节点:
:nth-of-type(n)
-
5--选择包含特定文本的节点:
:contains('text')
示例代码
假设我们有一个简单的 HTML 页面:
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Welcome to Example Page</h1>
<p id="intro">This is an example paragraph.</p>
<form>
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<button type="submit">Login</button>
</form>
</body>
</html>
常见 CSS 选择器示例
-
1--通过 ID 定位:
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome(executable_path='path/to/chromedriver') driver.get('https://example.com') # 通过 ID 定位 element = driver.find_element(by=By.CSS_SELECTOR, value='#username') print(element.get_attribute('name')) # 输出: username
-
2--通过类名定位:
# 通过类名定位 element = driver.find_element(by=By.CSS_SELECTOR, value='.class_name') print(element.text)
-
3--通过标签名和属性定位:
# 通过标签名和属性定位 element = driver.find_element(by=By.CSS_SELECTOR, value='input[type="text"]') print(element.get_attribute('id')) # 输出: username
-
4--通过标签名和多个属性定位:
# 通过标签名和多个属性定位 element = driver.find_element(by=By.CSS_SELECTOR, value='input[type="text"][name="username"]') print(element.get_attribute('id')) # 输出: username
-
5--通过包含部分属性值的节点定位:
# 通过包含部分属性值的节点定位 element = driver.find_element(by=By.CSS_SELECTOR, value='input[name*="user"]') print(element.get_attribute('id')) # 输出: username
-
6--通过父节点定位子节点:
# 通过父节点定位子节点 element = driver.find_element(by=By.CSS_SELECTOR, value='form > input[name="username"]') print(element.get_attribute('id')) # 输出: username
-
7--通过索引定位:
# 通过索引定位 element = driver.find_element(by=By.CSS_SELECTOR, value='form input:nth-of-type(1)') print(element.get_attribute('id')) # 输出: username
-
8--通过文本内容定位:
# 通过文本内容定位 element = driver.find_element(by=By.CSS_SELECTOR, value='button:contains("Login")') print(element.text) # 输出: Login