定位方式:
id
name
class name
tag name
link text
partial link text
xpath
css selector
1. id定位:find_element_by_id("id值");id属性是唯一的
from selenium import webdriver
driver =webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("wd").send_keys("selenium")
2. name定位:元素的名称,find_element_by_name("name值");name属性值在当前页面可以不唯一
from selenium import webdriver
driver = webdriver.Chrome(
driver.get(r'https://www.baidu.com/')
driver.find_element_by_name('wd').send_keys('selenium')
3. class定位:元素的类名,find_element_by_class_name("class值")
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
4. tag定位:页面html文档下的各种标签,find_element_by_tag_name("input");
tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。
任意打开一个页面,都会发现大量的<div>、<input>、<a>等tag,所以tag name定位很少用
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_tag_name('input').send_keys('selenium') ## 通过tag定位不建议,每个网页tag居多,没意义
5. link定位:专门用来定位文本链接,find_element_by_link_name("text");
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_link_text('新闻').click()
通过text()这个XPath中的函数也可以达到类似link text定位的目的。
这个“新闻”链接元素的XPath表达式可以这样写://*/div[@id='u1']/a[text()='新闻']
driver.find_element_by_xpath("//*/div[@id='u1']/a[text()='新闻']").click()
//*/div[@id='u1']/a[text()='新闻']
6. partial link定位:是对link定位的一种补充,当链接上的文本内容比较长的时候,可以取文本的一部分进行定位,当然这部分可以唯一地标识这个链接
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_partial_link_text('地').click()
注:以上的方式稍有局限,且经常页面没有id,name这些属性值,class name重复性较高,link定位有针对性,
所以Xpath与Css定位更灵活些。
7. XPath定位:find_element_by_xpath("");有多种定位策略,用FirePath插件自动生成的涵盖以下几种方式
①绝对路径定位:对于没有id,name、classname不好定位的,这也是我最常用的,因为可以通过Firefox的FirePath插件可以方便的获取到xpath值
②利用元素属性定位:
find_element_by_xpath(".//*[@id='Title']"),这里是用的id,也可以用元素其他能够唯一标识的属性,不局限于id、name、class这些;*代表的是标签名,不指定时就可以用*代替
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')
③XPath定位技巧之text()方法
以百度首页右上角“新闻”定位举例
XPath如下图
④XPath定位技巧之contains()方法
有时候,我们不喜欢写很长的XPath表达式,而且节点信息里面,有些信息是动态的,每次都获取都不一样,这个时候contains()方法就很好用。
JD首页左侧电脑菜单举例
⑤XPath写法推荐,这里用contains()方法来定位
这里href = //diannao.jd.com, 如果我觉得这个href太长,我只取关键字diannao,利用contains()方法来定位就方便多了,推荐电脑这个元素的XPath://*/a[contains(@href,'diannao')]
⑥相对XPath路径写法
有时候,我们遇到目标元素节点的信息很少,不足够用来精确定位到目标元素,这个时候,我们就需要考虑,利用目标元素上下附件节点,通过确定附件的节点从而确定目标元素,这种方式就叫相对路径。
这里用百度新闻首页的一个单选按钮来举例;
火狐浏览器上firepath给出的推荐表达式是:
这里推荐的XPath是根据目标元素节点中id信息来定位的,这个通过id就能定位,当然好。有时候,如果这个id不能作为参考值,我们需要利用相对定位方法来定位这个新闻标题前面的单选按钮;
1)先根据for = newstitle 或者text()=新闻标题来定位“新闻标题”这个标签。
2)根据相对定位来确定“新闻标题”前面的这个radio按钮。
3)XPath的写法是:.//*/label[@for='newstitle']/../input[@id='newstitle']
8. CSS定位(薄弱,用的很少,但很强大,比xpath简洁灵活):使用选择器来为页面元素绑定属性,可以灵活地选择控件的任意属性;
1)通过class属性定位:点号(".")表示通过class属性定位driver.find_element_by_css_selector(".u-btn.mart5").click()
2)通过id属性定位:("#")表示通过id定位元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_css_selector('#kw').send_keys('selenium')
3)通过其他属性定位:("[]"),中括号里的属性可以唯一标识这个元素就可以;属性的值可以加引号,也可以不加
driver.find_element_by_css_selector("[type=submit]").click()
这里用浏览器谷歌火狐的开发者工具可以实现xpath定位 、CSS定位
浏览器按F12
By定位
通过对上面8种基本元素定位方式的学习,在使用过程种可以根据实际的情况去选择对应的的定位方式,我们可以用By来设置定位策略,具体语法如下:
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")
上面这些使用的前提是需要导入By类:from selenium.webdriver.common.by import By