Selenium定位方法
一.基本定位
from selenium import webdriver
driver = webdriver.Chrome()
#八种定位方法
# id
# name
# class_name
# link_text
# partial_link_text
# tag_name
# css_selector
# xpath
#对应定位元素位置为单个时
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_element_by_css_selector()
driver.find_element_by_xpath()
#对应定位元素位置为多个时
driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_class_name()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_tag_name()
driver.find_elements_by_css_selector()
driver.find_elements_by_xpath()
二.自定义定位
from selenium.webdriver.common.by import By
定位方式:id=By.ID
定位方式:class_name=By.CLASS_NAME
定位方式:name=By.NAME
定位方式:tag_name=By.TAG_NAME
定位方式:css_selector=By.CSS_SELECTOR
定位方式:xpath=By.XPATH
定位方式:link_text=By.LINK_TEXT
定位方式:patial_link_text=By.PATIAL_LINK_TEXT
driver.find_element(定位方式,value)
driver.find_elements(定位方式,value)
方法源代码如图:(除xpath、link_text和patial_link_text外,基本上是用css_selector的方法)
总结:
通过方法源代码可以发现其实第一种方法返回的就是第二种方法的调用
定位方法解析:
id
id选择符为CSS像网页上的单个区域应用独特的css规则,class选择符可以在网页上多次应用,而id在每个网页上只能应用一次。
id名称可包含字母,数字,连字号和下划线。id名不能有空格
有id优先选用id定位
driver.find_element_by_id()
driver.find_elements_by_id()
name
name选择符,有name优先选用name
driver.find_element_by_name()
driver.find_elements_by_name()
class_name
class选择符配置某一类css规则,并将其应用于网页的一个或多个区域。
Class必须以字母开头,可包含数字和下划线,不能有空格。
driver.find_element_by_class_name()
driver.find_elements_by_class_name()
link_text
link元素将外部样式表与网页关联
link_test是以<a>标签开头,并且以</a>标签结尾中间的文本,表示显示的链接的文字,在网页中点击后跳转到“href=”指定的地址
driver.find_element_by_link_text()
driver.find_elements_by_link_text()
partial_link_text
partial_link_text是指与全局网页link_text中,互不重复且唯一的一个链接文字,定位后选择的网页元素功能等同于link_text
driver.find_element_by_partial_link_text()
driver.find_elements_by_partial_link_text()
tag_name
tag_name是以标签名为定位依据进行定位,但网页中重复的标签很多,因此只有在网页结构简单,或标签名唯一的情况下才可以使用,比较鸡肋
driver.find_element_by_tag_name()
driver.find_elements_by_tag_name()
css_selector
css_selector是以css网页格式渲染为定位依据,进行元素定位,由于渲染方式及位置的操作,会有一些相同类型的渲染,导致不能准确定位,所以还是要依靠xpath
driver.find_element_by_css_selector()
driver.find_elements_by_css_selector()
css_selector基本语法:
css_selector与xpath的区别:
1.绝对路径中与xpath不同的地方,不需要加”/”,且路径中的”/”换成”>”或”空格”
2.相对路径中与xpath不同的地方,不需要加”//”来表示相对路径
3.表示属性的名称时与xpath不同的地方,属性名前没有”@”符号
4.表示”标签、属性名、属性值”时与xpath不同的地方,为:标签[属性名=属性值],没有”@”和属性值上的引号
5.表示当前标签类中第n个标签时xpath不同的地方,为:nth-child(n),但相同的是,与xpath都是从1开始计算的
一、css_selector绝对路径
根据html或xml网页文本标记标签结构,从html标签起,逐层去定位目标元素
如:
html>body>div>div>div:nth-child(3)>form>div>div>div>input
html body div div div:nth-child(3) form div div div input
二、css_selector相对路径
忽略起始位置,从当前标签开始进行定位。选取当前标签的名称进行定位,逐层定位目标元素。要注意标签重复的问题,当定位起始标签名称在网页中不唯一时,css_selector相对路径不可用
,并且用”-”连接属性名和属性值;但是标签个数计算与xpath一样,从1开始计算,但改为小括号”()”表示
div>form>div:first-child
div>form>div:nth-child(3)
三、css_selector中嵌套前6种定位方法的应用
前6种定位方法 |
css_selector使用前6种定位方法的方法 |
find_element_by_id() |
#id属性 |
find_element_by_name() |
[name=name属性] |
find_element_by_class_name() |
.某一个class name |
find_element_by_link_text() |
不支持 |
find_element_by_partial_link_text() |
不支持 |
find_element_by_tag_name() |
标签名 |
xpath
xpath根据网页结构来进行逐层或逐标签,依照路径进行定位,因此可以定位到网页中的各个位置,所以又叫万能xpath
driver.find_element_by_xpath()
driver.find_elements_by_xpath()
xpath基本语法:
一、xpath绝对路径
根据html或xml网页文本标记标签结构,从html标签起,逐层去定位目标元素,层级顺序明显,但由于逐层定位,所以运行起来较慢,与网页结构复杂程度成正比
如:
/html/body/div/div/div[3]/form/div/div/div/input
/html/body/div[4]/label[4](xpath中标签的个数是从1开始计算的)
二、xpath相对路径
忽略起始位置,从当前标签开始进行定位。选取当前标签的名称进行定位,逐层定位目标元素。要注意标签重复的问题,当定位起始标签名称在网页中不唯一时,xpath相对路径不可用
如:
//div[@id=”firestdiv”]/form/div[3]
//a[contain(@href,”http://www.163.com”)]/../../input
1、//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(相对路径)
例://div[@id=”firestdiv”]/form/div[3](xpath中标签的个数是从1开始计算的)
2、.选取当前节点
例:很少用到
3、..选取当前节点的父节点
例://a[contain(@href,”http://www.163.com”)]/../../input
4、@选取属性(属性之间可以用and、or进行关联)
例://div[@id=”firestdiv”]、//input[@class=”stuname” or @type=”text”]、//input[@type=”text and @class=”stuname”]
5、查找所有input标签中含有type属性的元素
例://input[@type]
6、使用任意值来匹配属性及元素
例://input[@*=”fuck”] #匹配所有标签为input,且同时属性值为fuck
7、相对路径重复使用
例://table//input[@id=”accountID”] #表示选择table的子孙后代中id为accountID的input节点
三、xpath中嵌套前6种定位方法的应用
前6种定位方法 |
xpath使用前6种定位方法的方法 |
find_element_by_id() |
//*[@id=”id属性”](*表示任意标签,以属性id和值来定位,””中输入属性的值) |
find_element_by_name() |
//*[@name=”name属性”](*表示任意标签,以属性id和值来定位;””中输入属性的值) |
find_element_by_class_name() |
//*[contains(@class,”某一个class name”)]或//*[@class=”某一个class name”](*表示任意标签,以属性id和值来定位;””中输入属性的值,不重复即可) |
find_element_by_link_text() |
//a[contains(test(),”部分链接文字”)] |
find_element_by_partial_link_text() |
//a[test()=”链接文字”] |
find_element_by_tag_name() |
//标签名 |
xpath和css_selector的嵌套前6种定位方法的比较
前6种定位方法 |
xpath使用前6种定位方法的方法 |
css_selector使用前6种定位方法的方法 |
find_element_by_id() |
//*[@id=”id属性”](*表示任意标签,以属性id和值来定位,””中输入属性的值) |
#id属性 |
find_element_by_name() |
//*[@name=”name属性”](*表示任意标签,以属性id和值来定位;””中输入属性的值) |
[name=name属性] |
find_element_by_class_name() |
//*[contains(@class,”某一个class name”)]或//*[@class=”某一个class name”](*表示任意标签,以属性id和值来定位;””中输入属性的值,不重复即可) |
.某一个class name |
find_element_by_link_text() |
//a[contains(test(),”部分链接文字”)] |
不支持 |
find_element_by_partial_link_text() |
//a[test()=”链接文字”] |
不支持 |
find_element_by_tag_name() |
//标签名 |
标签名 |
xpath和css_selector定位方法操作的比较
定位查找方式 |
xpath |
css_selector |
任意标签 |
//div |
div |
下级路径 |
//div/form |
div form或者div>form |
索引 |
//div/form/div[1] //div/form/div[3] |
div>form>div:first-child div>form>div:nth-child(3) |
结合属性 |
//div[@id=”firstdiv”] |
div[id=firstdiv] |
任意节点 |
//*[@id=”firstdiv”] |
#firstdiv |
通过文本 |
//*[text()=”显示文本”] |
不支持 |
向上查找 |
//div/.. |
不支持 |