Selenium元素定位的30种方式(史上最全)

1.使用id定位元素

在页面中,每个元素都有一个唯一的id属性,我们可以通过id属性来定位元素。以下代码演示了如何使用id定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用id定位输入框并输入内容

input = browser.find_element_by_id('kw')

input.send_keys('Python')

在这段代码中,我们使用了webdriver的find_element_by_id()方法通过id属性来定位百度搜索框,并且输入了搜索内容“Python”。这种定位方式只能用于找到唯一的元素。

2.使用name定位元素

除了id属性外,元素还可以有name属性,我们也可以通过name属性来定位元素,使用的方法与id定位类似。以下代码演示了如何使用name定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用name定位输入框并输入内容

input = browser.find_element_by_name('wd')

input.send_keys('Python')

在这段代码中,我们使用了find_element_by_name()方法通过输入框的name属性来定位元素,并输入了搜索内容“Python”。这种定位方式同样只能用于找到唯一的元素。

3.使用tag name定位元素

在页面中,每个元素都有一个标签名,我们可以通过标签名来定位元素,使用的方法为find_element_by_tag_name()。以下代码演示了如何使用tag name定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用tag name定位输入框并输入内容

input = browser.find_element_by_tag_name('input')

input.send_keys('Python')

这段代码中,我们使用了find_element_by_tag_name()方法通过标签名找到了页面中的第一个元素,并输入了搜索内容“Python”。使用tag name定位元素会返回匹配到的第一个元素。

4.使用class name定位元素

元素还可以有class属性,如果某个元素的class属性是唯一的,我们可以通过class name来定位该元素。使用的方法为find_element_by_class_name()。以下代码演示了如何使用class name定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用class name定位搜索按钮并点击

button = browser.find_element_by_class_name('s_btn')

button.click()

在这段代码中,我们使用了find_element_by_class_name()方法通过按钮的class属性来定位该按钮,并执行了点击操作。使用class name定位元素可以返回匹配到的第一个元素。

5.使用Link Text定位链接

在页面中,链接通常通过标签实现,我们可以通过标签内的链接文本来定位链接,使用的方法为find_element_by_link_text()。以下代码演示了如何使用Link Text定位链接:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用Link Text定位链接并点击

link = browser.find_element_by_link_text('hao123')

link.click()

这段代码中,我们使用了find_element_by_link_text()方法通过链接文本“hao123”来定位链接,并执行了点击操作。使用Link Text定位链接时要注意,链接文本必须完全匹配,否则会找不到链接。

6.使用Partial Link Text定位链接

和Link Text类似,如果链接文本中包含一部分是唯一的,我们可以通过部分链接文本来定位链接,使用的方法为find_element_by_partial_link_text()。以下代码演示了如何使用Partial Link Text定位链接:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用Partial Link Text定位链接并点击

link = browser.find_element_by_partial_link_text('hao')

link.click()

这段代码中,我们使用了find_element_by_partial_link_text()方法通过部分链接文本“hao”来定位链接,并执行了点击操作。使用Partial Link Text定位链接时只需要匹配部分文本即可,但要注意匹配的文本不能重复,否则会找到多个匹配项。

7.使用XPath定位元素

XPath是一种用于在XML文档中定位元素的语言,由于HTML是一种XML语言,因此我们同样可以使用XPath来定位HTML元素。XPath的语法相对比较复杂,但是灵活性很强,使用它能够精确定位元素。以下代码演示了如何使用XPath定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用XPath定位搜索框并输入内容

input = browser.find_element_by_xpath('//input[@id="kw"]')

input.send_keys('Python')

这段代码中,我们使用了find_element_by_xpath()方法通过XPath定位搜索框,并输入了搜索内容“Python”。这里的XPath表达式'//input[@id="kw"]'表示查找id属性名为“kw”的元素,'//'表示查找所有匹配的元素。

8.使用CSS Selector定位元素

CSS Selector是一种用于在页面中定位元素的语言,它的语法和CSS样式规则很相似,使用起来比XPath要简单些。以下代码演示了如何使用CSS Selector定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用CSS Selector定位搜索框并输入内容

input = browser.find_element_by_css_selector('#kw')

input.send_keys('Python')

这段代码中,我们使用了find_element_by_css_selector()方法通过CSS Selector定位搜索框,并输入了搜索内容“Python”。这里的CSS Selector表达式'#kw'表示查找id属性名为“kw”的元素,'#'表示查找id属性。

9.使用多种属性组合定位元素

有时候,一个元素的id属性或class属性并不是唯一的,我们需要组合多个属性来定位元素。以下代码演示了如何使用多种属性组合定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用多种属性组合定位搜索按钮并点击

button = browser.find_element_by_css_selector('[name="wd"][class="s_btn"]')

button.click()

这段代码中,我们使用CSS Selector定位搜索按钮,通过组合input标签的name属性和class属性定位了搜索按钮,并执行了点击操作。CSS Selector表达式'[name="wd"][class="s_btn"]'表示同时满足name属性为“wd”和class属性为“s_btn”的元素。

10.使用Parent-Child关系定位元素

在页面中,元素之间还有一种包含与被包含的层次关系,使用Parent-Child关系可以定位父元素,进而从父元素出发定位子元素。以下代码演示了如何使用Parent-Child关系定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用Parent-Child关系定位搜索框并输入内容

div = browser.find_element_by_id('lg')

input = div.find_element_by_name('wd')

input.send_keys('Python')

这段代码中,我们首先通过id找到Search Box所在的

元素,并保存到变量div中,然后通过find_element_by_name()方法在div下搜索名字为“wd”的子元素,并执行输入操作。使用Parent-Child关系定位更加精确,可以避免同一页面上不同元素属性重复导致的混淆。

11.使用绝对定位方法定位元素

Selenium支持在页面上执行JavaScript代码,我们可以使用JavaScript代码来定位元素,这种定位方法最为灵活,但相应的代码比较复杂。以下代码演示了如何使用绝对定位方法定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用JavaScript代码定位搜索框并输入内容

input = browser.execute_script('return document.getElementById("kw")')

input.send_keys('Python')

这段代码中,我们首先通过execute_script()方法执行JavaScript代码,代码中使用的是document对象中的getElementById()方法来定位搜索框,并将定位好的元素返回,然后用返回的元素执行输入操作。使用绝对定位方法可以精确定位到页面上任意元素,但需要写更复杂的代码。

12.使用模糊匹配定位元素

在Selenium中,提供了一个模糊匹配的方法,使得我们可以根据部分属性匹配元素。以下代码演示了如何使用模糊匹配定位元素:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('http://www.baidu.com')

# 使用attribute_contains方法模糊匹配定位搜索框

input = browser.find_element_by_css_selector('input[id*="kw"]')

input.send_keys('Python')

这段代码中,我们使用CSS Selector定位输入框,并使用attribute_contains方法模糊匹配了id属性名包含“kw”的元素,并执行了输入操作。使用模糊匹配可以快速定位相关元素,但需要了解模糊匹配的具体方法。

13.使用动态元素处理方法定位元素

在页面上,元素可能随着页面滚动或某些操作的执行而动态生成或出现,此时我们需要使用动态元素处理方法来定位元素。以下代码演示了如何使用动态元素处理方法定位元素:

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as ec

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('https://www.taobao.com/')

# 使用expected_conditions方法定位搜索框并输入内容

wait = WebDriverWait(browser, 10)

input = wait.until(ec.presence_of_element_located((By.ID, 'q')))

input.send_keys('Python')

这段代码中,我们使用WebDriverWait()方法显式等待Python出现的搜索框动态元素,如果10秒内没有找到该元素,将抛出Timeout异常。如果找到该元素,使用presence_of_element_located()方法定位该元素,并执行输入操作。使用动态元素处理方法可以避免由于页面渲染延迟等原因导致的元素无法找到的问题。

14.进阶操作

14.1 选择器优化

对于复杂的页面,使用CSS Selector或XPath表达式定位元素时,选择合适的选择器表达式可以提高代码的稳定性和运行效率。以下是一些选择器优化的方法:

避免使用通配符

尽量使用id选择器

尽量少使用后代选择器

使用class选择器时,避免在class名前加标签名,尽量使用纯class名

使用属性选择器时,避免使用通配符

对于nth-child伪类,尽量使用单独的选择器

对于伪类和伪元素选择器,选择器要尽量简单

14.2 多元素选择方法

如果需要同时操作多个相同类型的元素,例如多个复选框,我们可以使用多元素选择方法,以下代码演示了如何使用多元素选择方法:

from selenium import webdriver

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('https://www.baidu.com/')

# 找到所有的复选框并选中

inputs = browser.find_elements_by_css_selector('input[type=checkbox]')

for input in inputs:

input.click()

这段代码中,我们使用find_elements_by_css_selector()方法找到所有的复选框,然后使用for循环遍历每个复选框,并执行点击操作。使用多元素选择方法可以提高代码的执行效率。

14.3 ActionChains操作

如果需要进行一系列的操作,例如滑动屏幕、鼠标悬停等,我们可以使用ActionChains来完成。以下代码演示了如何使用ActionChains操作:

from selenium import webdriver

from selenium.webdriver import ActionChains

# 启动浏览器

browser = webdriver.Chrome()

# 访问页面

browser.get('https://www.baidu.com/')

# 找到元素并执行ActionChains操作

element = browser.find_element_by_link_text('设置')

ActionChains(browser).move_to_element(element).perform()