What is 元素定位?
什么是元素?HTML文件中的一个组成单元,包括文字,图画,视频等等…在Selenium中提供了8中元素定位方法,如下表所示:
定位方式 | 对应方法 |
---|---|
ID | driver.find_element(By.ID, value = ‘su’) |
name | driver.find_element(By.NAME, value = ‘wd’) |
class name | driver.find_element(By.CLASS_NAME, ‘s_ipt’) |
tag name | driver.find_element(By.TAG_NAME, ‘title’) |
link text | driver.find_element(By.LINK_TEXT, ‘su’) |
partial link text | driver.find_element(By.PARTIAL_LINK_TEXT, ‘wd’) |
xpath | driver.find_element(By.XPATH, ‘s_ipt’) |
css selector | driver.find_element(By.CSS_SELECTOR, ‘title’) |
from selenium.webdriver.common.by import By别忘了加
根据ID定位
怎么找一个元素的ID?通过开发者界面找到对应的id,如百度的搜索框id为“kw”,“百度一下”的按钮的id为“su“,如果要对百度网页进行搜索操作,就可以使用如下代码:
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#通过id查找并且输入要查找的字眼
driver.find_element(by = By.ID,value = "kw").send_keys("王俊凯")
#点击百度一下
driver.find_element(by = By.ID,value ="su").click()
代码中send_keys()是一个向搜索框发出特定字符串的方法,click()是向某个特定的HTML元素发送确认请求的方法
然后就会看见它自动到了这个界面:
接下来说说怎么找到对应的ID呢?首先点击chrome浏览器页面右上角的三个点,选择更多工具中的开发者工具,点击工具栏左上角中一个有鼠标图案的地方,然后将鼠标放在你想看的区域,点击确认,即可看见相应的源码。
根据name定位
ID和name看上去一样,但是还是有区别的。ID相当于是一个人的身份证号码,而name就是他的名字。就可以发现,ID是唯一的,但是name可以重复。还是举前面的例子,百度搜索栏的name是”wd“,所以上文中的driver.find_element(by = By.ID,value = "kw").send_keys("王俊凯")
应该替换为driver.find_element(by = By.NAME,value = "wd").send_keys("王俊凯")
根据XPATH定位
这篇博客里比较详细地介绍了Xpath定位的方法:Xpath定位的两种方法
简单来说,就是用前面讲过的方法打开像定位元素的源码,右键点击,选中copy,接着点击最下面的Copy full Xpath或者Copy Xpath,代码如下所示。
这个是full Xpath:
driver.find_element(by = By.XPATH,value = "/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input").send_keys("王俊凯")
这个是Xpath:
driver.find_element(by = By.XPATH,value = r'//*[@id="kw"]').send_keys("王俊凯")
这里有个小问题,使用copy Xpath时copy下来的是//[@id=“kw”],要r’//[@id=“kw”]‘这样写,不能直接用"//*[@id=“kw”]",因为会有语法错误,要使用r’'转义,同时要将这个单引号和XPath的双引号进行区分,避免出错。
根据标签名(Tag name)定位
这种方式因为存在很多一样的标签,经常会定位失败,只需要了解有这么种方法就ok,这里就不学了。
根据Class name定位
好吧,感觉这个不是很好用,以后要用到的时候再说吧。。。。。
根据CSS选择器定位
以百度搜索框为例,前面已经知道了百度搜索框的name为wd,id为kw
- [name=wd] : 表示选择所有name属性为wd的元素
- #kw : 选择id为kw的元素
- a[src^=“http”] : 选择所有以http作为src开头的元素
- “html>body>form>span>input”:从标签html中选出标签body,以此类推直到input标签
- .s_ipt :选择所有class属性为.s_ipt的标签,不要忽略.
根据Link Text定位
Link Text定位的是带有超链接的文字
使用语法:driver.find_element(By.LINK_TEXT,value= ‘[text]’)
time.sleep(2)
driver.find_element(by = By.LINK_TEXT ,value = "视频").click()
driver.back()
根据Partial Link Text
如果不想打完搜索的全部字符,就可以使用这种方法,语法为:
driver.find_element(By.PARTIAL_LINK_TEXT,value= “[text]”)
如以下示例代码:
time.sleep(2)
driver.find_element(by = By.PARTIAL_LINK_TEXT ,value = "新").click()
driver.back()
总结
总体来说,id和class定位最为方便,但是Link Text最为实用,XPATH也算比较好用,根据实际情况判断。