这里的定位值得是在web页面定位元素,是selenium的核心。
webdriver(网页驱动软件)模块有9中定位元素的方法。
id定位--find_element_by_id()
name定位---find_element_by_name()
class定位--find_element_by_class_name()
link定位--find_element-by_link_text()
partial link定位---find_element_by_partial_link_text()
javascript定位---document.getElementByld().value='' "
tag定位--find_elements_tag_name()
xpath定位---find_element_by_xpath()
css定位--find_element_by_css_selector()
那么如何定位元素,怎么在页面上定位?请看下图。
随便打开一个页面,比如打开百度,按F12进入开发工具。
这里通过这个小按钮切换到选元素模式,点击要选择的元素就会自动在右侧代码取显示。
现在来看看具体的这九种定位方法
第一种:id--find_element_by_id()
from selenium import webdriver
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("通过id定位元素")
#这里找到百度输入框的id,并输入‘通过id定位元素'
driver.close()#为了不占内存,运行完就直接关闭
第二种:name定位 find_element_by_name()
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_name("wd").send_keys("通过name定位元素")
time.sleep(2)
#这里找到百度输入框的name,并输入‘通过name定位元素'
driver.close()#为了不占内存,运行完就直接关闭
第三种:class定位find_element_by_class_name()
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_class_name("s_ipt").send_keys("通过class定位元素")
time.sleep(2)
#这里找到百度输入框的class,并输入‘通过class定位元素'
driver.close()#为了不占内存,运行完就直接关闭
第四种:link 定位 find_element_by_link_text()
这种方法常用于a标签,获取a标签的值,常和click点击一起用
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_link_text("地图").click()#点击地图这个元素跳转
time.sleep(2)
#这里找到地图这个元素,并点击跳转进入'
driver.quit()#为了不占内存,运行完就直接关闭
第五种:partial link模糊定位 find_element_by_partial_link_text()
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_partial_link_text("ao").click()
#这里准备点击hao123这个元素,因为是模糊查询,所以从”hao123“中随机拿几个进行匹配
time.sleep(2)
#这里找到hao123这个元素,并点击跳转进入'
driver.quit()#为了不占内存,运行完就直接关闭
第六种:javascript定位(简称js定位)document_getElementByld('id值').value='输入值'
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
js='document.getElementById("kw").value="javascript定位"'
driver.execute_script(js)#执行js
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
第七种:tag定位find-elements_by_tag_name()
首先 了解下element和elements用法的区别。
find_element_by_id('id值')适用于只有一个固定id的值的时候,如果一个页面中有多个id,且值不同这时用element就无法查询,就要适用elements也就是find-elements_by_id("要查找的id的值")。
另外要了解一个getAttribute()方法,他是一个函数。它只有一个参数,意思就是你想查询的这个属性的名字。这个方法和javascrip定位的方法相似,document.getElementById().value="",不同的是这个函数不能用document来调用,要用一个元素节点对象来调用。
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
input=driver.find_elements_by_tag_name('input')#注意一个页面有很多的input标签所以这里用elements
print(input)
for i in input:
if i.get_attribute('id')=='kw':
#这里我们是定位了id是kw的输入框,当然也可以是name,i.get_attribute('name')=='wd',或者是class都是可以的
i.send_keys("tag定位")
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
第八种:xpath定位这里是根据路径定位。find_element_by_xpath()
这里有两种路径:绝对定位和相对定位。
绝对定位使用绝对路径:
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
#绝对路径:/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys("xpath中绝对路径定位")
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
相对路径:通过id、name、class、组合定位等其他属性来获取元素
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("xpath中id定位")
driver.find_element_by_xpath('//*[@name="wd"]').send_keys("xpath中name定位")
driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys("xpath中class定位")
driver.find_element_by_xpath('//*[@class="s_ipt" and @name="wd" ]').send_keys("xpath中的组合定位")
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
还有一种通过上一级标签来定位,出现这种情况一般都是我们选定的元素没有id这个属性,那么他的相对路径就要往上找一层(父级),如果上一级也么有id那么在往上找一级(爷爷级)。
第九种:css定位driver.find_element_by_css_seletor("#") 这里不同于其他的是简写了。
css中id定位的简写。
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector("#kw").send_keys("css的id定位")
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
css不简写情况:
from selenium import webdriver
import time
driver=webdriver.Chrome()#获取一个谷歌的对象
driver.get("https://www.baidu.com/")
driver.find_element_by_css_selector("[id='kw']").send_keys("css的id定位")
driver.find_element_by_css_selector("[name='wd']").send_keys("css的name定位")
driver.find_element_by_css_selector("[class='s_ipt']").send_keys("css的class定位")
driver.find_element_by_css_selector(".s_ipt").send_keys("css的class简写定位")
driver.find_element_by_css_selector("[class='s_ipt'][id='kw']").send_keys("css的class、id组合定位")
driver.find_element_by_css_selector("form>span>input").send_keys("css的上级的上级定位")
driver.find_element_by_css_selector("span>input").send_keys("css的上级定位")
time.sleep(4)
driver.quit()#为了不占内存,运行完就直接关闭
总结:
1.有id优先使用id来定位
2.如果没有id考虑name或者class
3.如果没有id,name,class,在考虑xpath,css定位
4,如果是链接使用link_text,partial_link_text定位
5.tag_name和JavaScript用的少