当我们想让 Selenium 自动地操作浏览器时,就必须告诉 Selenium 如何去定位某个元素或一组元素,每个元素都有着不同的标签名和属性值,Selenium 提供了以下8种定位元素的方式,每种方式对应了2个方法:
find_element_by_( ),是用来定位单个元素的,find_elements_by_( ),是用来定位多个元素的。
- 通过 id 定位
- 通过 name 定位
- 通过 class 定位
- 通过 tag 定位
- 通过 link 定位
- 通过 partial link 定位
- 通过 xpath 定位
- 通过 css 选择器定位
下面以百度首页为例进行举例说明:
1.通过 id 定位
find_element_by_id(id)
find_elements_by_id(id)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位id为“kw”的元素
input_text = driver.find_element_by_id( "kw" )
input_text.send_keys( "selenium" )
driver.quit()
|
2.通过通过 name 定位
find_element_by_name(name)
find_elements_by_name(name)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位name为“wd”的元素
input_text = driver.find_element_by_name( "wd" )
input_text.send_keys( "selenium" )
driver.quit()
|
3.通过 class 定位
find_element_by_class_name(name)
find_elements_by_class_name(name)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位class名称为“s_ipt”的元素
input_text = driver.find_element_by_class_name( "s_ipt" )
input_text.send_keys( "selenium" )
driver.quit()
|
4.通过 tag 定位
find_element_by_tag_name(name)
find_elements_by_tag_name(name)
1
2
3
4
5
6
7
8
9
10
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位标签为<input>的元素
input_text = driver.find_elements_by_tag_name( "input" )
print ( len (input_text))
driver.quit()
|
5.通过 link 定位
find_element_by_link_text(link_text)
find_elements_by_link_text(link_text)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位链接文本完全匹配“我新闻”的元素
news = driver.find_element_by_link_text( "新闻" )
news.click()
driver.quit()
|
6.通过 partial link 定位
find_element_by_partial_link_text(link_text)
find_elements_by_partial_link_text(link_text)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# 定位链接文本部分匹配“新”的元素
news = driver.find_element_by_partial_link_text( "新" )
news.click()
driver.quit()
|
7.通过 xpath 定位
find_element_by_xpath(xpath)
find_elements_by_xpath(xpath)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# xpath定位,相对路径与属性结合定位搜索框
news = driver.find_element_by_xpath( "//input[@id='kw']" )
news.click()
driver.quit()
|
8.通过 css 选择器定位
find_element_by_css_selector(css_selector)
find_elements_by_css_selector(css_selector)
1
2
3
4
5
6
7
8
9
10
11
|
# _*_ coding:utf-8 _*_
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get( "https://www.baidu.com/" )
# css选择器,id定位密码输入框
news = driver.find_element_by_css_selector( '#kw' )
news.click()
driver.quit()
|
通用的终极定位语法
上面的所有元素定位 find_element_by_xxx和find_elements_by_xxx调用的结果,实际上都是在调用以下两种方法,我们也可以直接调用一下两种方法即可。
find_element(self, by=By.ID, value=None):
find_elements(self, by=By.ID, value=None):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class By( object ):
"""
Set of supported locator strategies.
"""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
|
例如:
1
2
3
4
5
6
7
8
9
10
|
from selenium.webdriver.common.by import By
# 根据id,定位id为“world”的元素
world = driver.find_element(By. ID , "world" )
print (world.text)
# xpath定位,相对路径与属性结合 定位密码输入框
password = driver.find_element(By.XPATH, "//input[@name='password']" )
print (password.get_attribute( "value" ))
# css选择器,标签+属性 定位用户名输入框
username = driver.find_element(By.CSS_SELECTOR, "input[name='username']" )
print (username.get_attribute( "value" ))
|
这里只是简单介绍了8种元素定位方式的使用,比较简单易用的是通过id、name、class定位,我个人比较喜欢的是用xpath定位,当然,最灵活也是最强大的定位方式就是css,它也是比较难掌握的一种方式。关于xpath和css定位方式的详细介绍,可以
参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000018260866